Nginx优化
文章目录
[root@nignx001 ~]# cat /etc/nginx/conf/nginx.conf
#将nginx进程设置为普通用户,为了安全考虑
user tomcat;
#当前启动的worker进程,官方建议是与系统核心数一致
worker_processes auto;
#自动分配绑定
worker_cpu_affinity auto;
#日志配置
error_log logs/error.log crit;
pid logs/nginx.pid;
#针对 nginx 句柄的文件限制
worker_rlimit_nofile 65535;
#事件模型
events {
#使用epoll内核模型
use epoll;
#每一个进程可以处理多少个连接,如果是多核可以将连接数调高 worker_processes * 1024
worker_connections 65535;
}
http {
include mime.types;
default_type application/octet-stream;
charset utf-8; #设置字符集
#设置日志输出格式,根据自己的情况设置
log_format main '$http_x_forwarded_for - $remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent"' '$upstream_status $upstream_response_time $request_time';
access_log logs/access.log main;
sendfile on; #对静态资源的处理比较有效
tcp_nopush on; #如果做静态资源服务器可以打开
keepalive_timeout 1800;
client_max_body_size 50m;
client_body_buffer_size 3069k;
proxy_ignore_client_abort on;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
proxy_buffer_size 128k;
proxy_http_version 1.1;
proxy_buffers 32 128k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_intercept_errors on;
proxy_hide_header X-Powered-By;
proxy_hide_header Server;
server_names_hash_bucket_size 256;
#Gzip module
gzip on; #文件压缩默认可以打开
gzip_min_length 1k;
gzip_buffers 4 128k;
gzip_comp_level 5;
gzip_types text/plain text/css text/xml application/javascript application/rss+xml application/json;
gzip_disable "MSIE [1-6]\.";
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
server_tokens off;
server {
listen 80;
ssl_protocols TLSv1.2;
location /status {
stub_status on;
}
}
include /home/nginx/conf/*.conf;
include /home/nginx/conf/yunwei/*.conf; 可以添加自己指定的目录
}
1.文件句柄
系统全局性修改和用户局部性修改
vim /etc/security/limits.conf
#在End of file前面添加4个参数
# End of file
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
进程局部性修改
vim /etc/nginx/nginx.conf
#每个进程的最大文件打开数,所以最好与ulimit -n的值保持一致
pid logs/nginx.pid;
worker_rlimit_nofile 35535; #进程限制
2.cpu的亲和配置
cpu的亲和能够使nginx对于不同的work工作进程绑定到不同的cpu上面去。就能够减少在work间不断切换cpu,把进程通常不会在处理器之间频繁迁移,进程迁移的频率小,来减少性能损耗
具体设置
Nginx运行工作进程个数一般设置CPU的核心或者核心数x2。如果不了解cpu的核数,可以top命令之后按1看出来,也可以查看/proc/cpuinfo文件 grep ^processor /proc/cpuinfo | wc -l。
less /etc/nginx/nginx.conf
worker_processes auto; #根据需要情况自己分配
worker_cpu_affinity auto;
查看CPU数量
[root@node1 ~]# cat /proc/cpuinfo | grep "physical id"|sort|uniq|wc -l
2
查看CPU核心数
[root@node1 ~]# cat /proc/cpuinfo|grep "cpu cores"
cpu cores : 1
cpu cores : 1
查看nginx使用cpu核心和对应的nginx进程号
ps -eo pid,args,psr | grep [n]ginx
3.事件处理模型优化
nginx的连接处理机制在于不同的操作系统会采用不同的I/O模型,Linux下,nginx使用epoll的I/O多路复用模型,在freebsd使用kqueue的IO多路复用模型,在solaris使用/dev/pool方式的IO多路复用模型,在windows使用的icop等等。要根据系统类型不同选择不同的事务处理模型,我们使用的是Centos,因此将nginx的事件处理模型调整为epoll模型。
cat /etc/nginx/nginx.conf
events {
use epoll;
worker_connections 65535;
}
4.设置work_connections 连接数
worker_connections 10240;
5.keepalive timeout会话保持时间
keepalive_timeout 1800;
经调研得知nginx默认设置的http连接超时时间为75s,超过75s,会断掉当前的http连接,而大文件上传时经常会超过75s,这就导致大文件无法上传成功,当时的解决方案是,设置nginx http连接超时时间为30分钟,即参数keepalive_timeout=1800;文件上传问题基本解决;
6.GZIP压缩性能优化
gzip on;
gzip_min_length 1k;
gzip_buffers 4 128k;
gzip_comp_level 5;
gzip_types text/plain text/css text/xml application/javascript application/rss+xml application/json;
gzip_disable "MSIE [1-6]\.";
7.proxy超时设置
proxy_ignore_client_abort on;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
proxy_buffer_size 128k;
proxy_http_version 1.1;
proxy_buffers 32 128k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_intercept_errors on;
proxy_hide_header X-Powered-By;
proxy_hide_header Server;
8.高效传输模式
sendfile on; # 开启高效文件传输模式。
tcp_nopush on; #需要在sendfile开启模式才有效,防止网路阻塞,积极的减少网络报文段的数量。将响应头和正文的开始部分一起发送,而不一个接一个的发送
9.Linux系统内核层面
Nginx要达到最好的性能,出了要优化Nginx服务本身之外,还需要在nginx的服务器上的内核参数。
这些参数追加到/etc/sysctl.conf,然后执行sysctl -p 生效。
1)调节系统同时发起的tcp连接数
net.core.somaxconn = 262144
2)允许等待中的监听
net.core.somaxconn = 4096
3) tcp连接重用
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
4)不抵御洪水攻击
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144 #该参数用于设定系统中最多允许存在多少TCP套接字不被关联到任何一个用户文件句柄上,主要目的为防止Ddos攻击
5) 最大文件打开数
ulimit -n 30000
10.ab接口压力测试工具
yum install httpd-tools -y
ab -n 2000 -c 2 http://127.0.0.1/
-n :总的请求数
-c :并发数
-k 是否开启长连接
11.nginx做白名单限制
#前端代理 nginx1-nginx2-后端
nginx1
[root@nignx001 ~]# cat /home/nginx/conf/xxxx/xxx.conf
server
{
listen 80;
server_name xxx.xxxx.cn;
access_log /home/xxx/logs/nginx/xxx/xxx/xxx/xxx_access.log main;
rewrite ^/(.*)$ https://xxx.sdycsdyc.cn/$1 permanent;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://xxxx:8080;
}
}
server {
listen 443;
server_name xxx.xxxx.cn;
access_log /home/xxx/logs/nginx/xxx/xxx/nginx001/xxx_ssl_access.log main;
ssl on;
ssl_certificate /home/xxx/ssl_config/xxxx.pem;
ssl_certificate_key /home/xxx/ssl_config/xxxx.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM;
ssl_prefer_server_ciphers on;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://xxx:8080;
}
include /home/nginx/conf/allow-xxx.conf;
}
#白名单限制
cat /home/nginx/conf/allow-xxx.conf
allow 1.1.1.0/25;
deny all;
nginx2
[root@k-nginx 100qu-test]# cat cashier.conf
upstream t-cashier {
server xxxx:8080;
}
server {
listen 80;
server_name xxx.xxx.cn 120.26.6.234;
access_log /home/100qu/logs/test-nginx/xxx/xxx_access.log main;
add_header X-Frame-Options SAMEORIGIN;
if ($request_method !~* GET|POST|OPTIONS) {
return 403;
}
# rewrite ^/(.*)$ https://xxx.xxx.cn/$1 permanent;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://t-cashier;
proxy_redirect default;
}
}
server {
listen 443;
server_name xxx.xxx.cn;
access_log /home/xxx/logs/test-nginx/xxx/xxx_ssl_access.log main;
add_header X-Frame-Options SAMEORIGIN;
if ($request_method !~* GET|POST|OPTIONS) {
return 403;
}
ssl on;
ssl_certificate xxx.pem;
ssl_certificate_key xxx.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM;
ssl_prefer_server_ciphers on;
location ~* ^/druid {
allow 127.0.0.1;
deny all;
}
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://t-cashier;
proxy_redirect default;
}
}