1. nginx.conf配置
user nginx;
worker_processes 8; //根据cpu配置
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; //根据cpu配置,4核或者其它不一样
worker_rlimit_nofile 65535;
#error_log /var/log/nginx/error.log crit;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
client_max_body_size 250m;
client_body_timeout 20s;
client_header_timeout 20s;
client_body_buffer_size 256k;
large_client_header_buffers 4 64k;
send_timeout 15s;
keepalive_timeout 60s;
types_hash_max_size 2048;
client_header_buffer_size 16k;
fastcgi_buffers 256 16k;
fastcgi_buffer_size 128k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
open_file_cache max=65535 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 5;
open_file_cache_errors off;
gzip on;
gzip_min_length 1k;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
include /etc/nginx/mime.types;
default_type application/octet-stream;
set_real_ip_from 100.64.0.0/10;
real_ip_header X-Forwarded-For;
include /etc/nginx/conf.d/*.conf;
}
2. server 段配置
limit_req_zone $binary_remote_addr zone=vlimit:10m rate=30r/s; //限流zone是名称,10m是用10m存ip,30r/s是每秒每个ip允许30个请求
upstream php-fpm { //开启多个进程池,进行轮询
server unix:/dev/shm/http-php-cgi.sock; //写入到内存提升性能
server unix:/dev/shm/www-php-cgi.sock;
}
server {
listen 80;
server_name xxxxx;
deny xxx.xxx.xxx.xx;
access_log /var/www/logs/access.log main buffer=32k;
error_log /var/www/logs/error.log;
root /var/www/wwwroot/xxx;
index index.html index.htm index.php;
add_header 'Access-Control-Allow-Origin' '*';
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security max-age=86400;
#add_header Content-Security-Policy "upgrade-insecure-requests;";
add_header X-Frame-Options SAMEORIGIN;
limit_req zone=vlimit burst=4 nodelay; //限流的名称,burst 表示1个请求会存储到burst队列,不会直接返回503,有助于流量平滑,不会直接拒绝 nodelay表示直接处理降低排队时间,两个要配合使用,否则可能会rtt增加
limit_req_status 503; //超出限流控制返回的状态码
location / {
}
location ~ \.php {
#fastcgi_pass 127.0.0.1:9000; //以tcp方式与php通信,有些说tcp更稳定
#fastcgi_pass unix:/dev/shm/php-cgi.sock; //使用unix方式通信,文件存于内存位置提升性能,但是有说法unix方式高并发下不稳定
fastcgi_pass php-fpm; //以轮询方式,参考文件首部upstream
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
3. php 优化
找到php-fpm.d/目录,里面的www.conf文件复制一份名字随意
修改配置
; Start a new pool named 'www'.
[www] //第二个文件这个必须换成其它名字
....
;listen = 127.0.0.1:9000 //tcp方式
listen = /dev/shm/www-php-cgi.sock //sock方式
...
; Set listen(2) backlog.
; Default Value: 511 (-1 on FreeBSD and OpenBSD)
listen.backlog = 1024 //这个值调大,据说可以提升unix方式在高并发下的稳定性
...
pm = static //有好几种方式,static,dynamic,ondemand 默认为dynamic,具体看自己
; Note: This value is mandatory.
pm.max_children = 150 根据前面配置的方式这个值自己设置,一般说一个进程30m内存
4. 系统内核tcp参数优化
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 65535
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 524288 699050 1048576
net.ipv4.tcp_fin_timeout = 1
4. 系统文件句柄
查看 ulimit -a
修改
ulimit -n 65535 //仅本次有效
永久修改
修改文件cat /etc/security/limits.conf
,这个值可以改大点,不会影响什么
# End of file
root soft nofile 655350
root hard nofile 655350
* soft nofile 655350
* hard nofile 655350
5. 常用大日志分析 awk
access.log
是要分析的日志文件
$1,$2,$3
具体代表什么根据你的日志格式
22/Sep/2020:21
根据你日志里面的时间格式调整,你需要分析哪个时间点
awk '{print $4,$1}' access.log | grep 22/Sep/2020:21 | awk '{print $2}'| sort | uniq | wc -l //统计时间段有多少ip访问
cat access.log |grep 22/Sep/2020:21:01|awk '{print $11}' |sort|uniq -c|sort -nr | head -10 //统计访问最多的前10个来源
cat access.log |grep 22/Sep/2020:21:01|awk '{print $7}' |sort|uniq -c|sort -nr | head -10 //统计访问最多的前10个页面
grep ^104.179.60.129 access.log| awk '{print $1,$4,$7}' //查看某个ip访问的页面
awk '{++S[$1]} END {for (a in S) print a,S[a]}' access.log > log.txt //每个ip访问的次数,输出到文件
通过以上方式,你可以看到你有多少个请求,查看访问最多的来源,可以看下是否非法请求,另外根据ip访问的次数,可以看到是否非法ip,如果是非法ip,可以通过nginx deny拒绝访问
6. 其它
读写分离:如果事务里面包含查询语句,会分配到主实例,尽量缩小事务范围,另外业务流程中如果有update,delete语句也会到主实例,所以考虑下是否需要异步
php看下是否需要升级到比较高到版本。一些语法上到优化。
参考文章 参考文章