Nginx配置和调优记录

本文为个人使用Nginx过程中遇到问题,总结出的学习记录,不一定保证内容完全正确,仅供参考。所使用Linux版本为CentOS Linux release 7.7.1908 (Core)

Nginx的HTTPS配置

Nginx配置http重定向到https

# 配置主域名http转https
server {
    listen 80;
    index index.php index.htm index.html; 
    server_name www.maplefix.top maplefix.top;
    return 301 https://maplefix.top$request_uri;
}

Https配置www跳转到no-www

#将www.maplefix.top带www的http访问重定向到不带www的https地址
    server {
     listen *:80;
     listen *:443 ssl; 
     listen [::]:80;
     listen [::]:443 ssl; 
     server_name www.maplefix.top;
     ssl on;
     ssl_certificate  cert/2020311-2021311_maplefix.top.pem;
     ssl_certificate_key  cert/2020311-2021311_maplefix.top.key;
     ssl_session_timeout 5m;
     ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
     ssl_prefer_server_ciphers on;
     return 301 https://maplefix.top$request_uri;
 }
 #将maplefix.top的http访问重定向到不带www的https地址
 server {
         listen *:80;
         listen [::]:80;
         server_name maplefix.top;
         return 301 https://maplefix.top$request_uri;
 }
 #配置主域名指向地址
 server {
         listen *:443 ssl; 
         listen [::]:443 ssl; 
         server_name maplefix.top;    
         ssl on;
         ssl_certificate  cert/2020311-2021311_maplefix.top.pem;
         ssl_certificate_key  cert/2020311-2021311_maplefix.top.key;
         ssl_session_timeout 5m;
         ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
         ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
         ssl_prefer_server_ciphers on;
         location / {
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header Host $http_host;
             proxy_set_header X-NginX-Proxy true;
             proxy_pass http://127.0.0.1:8090;
             proxy_redirect off;
         }
 }

Nginx调优记录

worker进程数配置

worker进程数默认值为1,该值应该设置为CPU核心数。

#查看CPU核心数
grep -c processor /proc/cpuinfo

CPU多核心情况下进程绑定

如果是单核CPU就不需要考虑这个问题了。默认情况下,Ngin多个进程可能跑在一个CPU或一个CPU的某一核上,导致Nginx进程使用资源不均,影响Nginx性能。因此可以绑定Nginx进程到不同CPU上。

# 2核CPU的配置
worker_processes  2;         
worker_cpu_affinity 01 10;
# 4核CPU的配置
worker_processes  4;         
worker_cpu_affinity 0001 0010 0100 1000;   
# 8核CPU的配置
worker_processes  8;         
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 1000000;

优化最大连接数

默认的worker_connections值为1024.该值的大小有两个重要指标,内存和linux文件句柄限制。
如果没修改句柄限制直接修改最大连接参数超过1024的话有时候会出现“Socket/File: Can’t open so many files”。
使用ulimit -a查看Linux相关限制,可以看到open files (-n) 1024,即默认最大打开文件数为1024.临时修改该值可以用ulimit -n Number修改最大文件句柄限制,但该种修改方式仅仅对当前session有效。
永久有效方案:

#在limits.conf文件末尾添加以下参数
vim /etc/security/limits.conf
* soft   nofile   40960
* hard   nofile   65536

参数说明:

  • 代表所有用户有效
  • soft:软限制,超过会报warn
  • hard:实际限制
  • nofile:文件句柄参数
  • number:最大文件句柄数

接数包括代理服务器的连接、客户端的连接等,Nginx 总并发连接数 = worker_processes * worker_connections。总数保持在 3w 左右即可。
两核CPU可配置如下:

worker_processes  2;
worker_cpu_affinity 01 10;
user nginx nginx;
events {
    use epoll;
    worker_connections  15000;
}

开启高效文件传输模式

sendfile 参数用于开启文件的高效传输模式.
tcp_nopush 参数用于激活 Linux 上的 TCP_CORK socket 选项,此选项仅仅当开启 sendfile 时才生效,tcp_nopush 参数可以把 http response header 和文件的开始部分放在一个文件里发布,以减少网络报文段的数量。

http {
   include       mime.types;
   default_type  application/octet-stream;
   sendfile      on;    # 开启文件的高效传输模式
   tcp_nopush    on;    # 激活TCP_CORK socket选择
   tcp_nodelay   on;    # 数据在传输的过程中不进缓存
   ...
}

优化连接超时时间

  • keepalive_timeout:用于设置客户端连接保持会话的超时时间,超过这个时间服务器会关闭该连接。
  • client_header_timeout:用于设置读取客户端请求头数据的超时时间,如果超时客户端还没有发送完整的 header 数据,服务器将返回 "Request time out (408)" 错误。
  • client_body_timeout:用于设置读取客户端请求主体数据的超时时间,如果超时客户端还没有发送完整的主体数据,服务器将返回 "Request time out (408)" 错误。
  • send_timeout:用于指定响应客户端的超时时间,如果超过这个时间,客户端没有任何活动,Nginx 将会关闭连接。
  • tcp_nodelay:默认情况下当数据发送时,内核并不会马上发送,可能会等待更多的字节组成一个数据包,这样可以提高 I/O 性能,但是,在每次只发送很少字节的业务场景中,使用 tcp_nodelay 功能,等待时间会比较长。
http {
   include       mime.types;
   default_type  application/octet-stream;
   sendfile      on;    # 开启文件的高效传输模式
   tcp_nopush    on;    # 激活 TCP_CORK socket 选择
   tcp_nodelay   on;    # 数据在传输的过程中不进缓存
   keepalive_timeout  65;
   client_header_timeout 15;
   client_body_timeout 15;
   send_timeout 25;
   ...
}

gzip压缩

需要压缩的对象有 html 、js 、css 、xml 、shtml ,图片和视频尽量不要压缩,因为这些文件大多都是已经压缩过的,如果再压缩可能反而变大。另外,压缩的对象必须大于 1KB,由于压缩算法的特殊原因,极小的文件压缩后可能反而变大。

http {
    gzip  on;                    # 开启压缩功能
    gzip_min_length  1k;         # 不压缩临界值,大于1K的才压缩,一般不用改
    gzip_buffers  4 32k;         # 压缩缓冲区大小,表示申请4个单位为32k的内存作为压缩结果的缓存
    gzip_http_version  1.1;      # 压缩版本,用于设置识别HTTP协议版本
    gzip_comp_level  9;          # 压缩级别,1级压缩比最小但处理速度最快,9级压缩比最高但处理速度最慢
    gzip_types  text/plain application/x-javascript text/css application/xml text/javascript image/jpeg image/gif image/png;;    		# 允许压缩的媒体类型,非设置值则不进行压缩
    gzip_disable "MSIE [1-6]\."; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
    gzip_vary  on;               # 该选项可以让前端的缓存服务器缓存经过gzip压缩的页面,例如用代理服务器缓存经过Nginx压缩的数据
}

配置expires缓存期限

当用户第一次访问这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次及以后继续访问该网站时,浏览器会检查加载已经缓存在用户浏览器本地的内容,就不会去服务器下载了,直到缓存的内容过期或被清除。
不希望被缓存的内容:广告图片、网站流量统计工具、更新很频繁的文件。

server {
    listen       443;
    server_name  maplefix.top;
    root    	/root/.haol/static;
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {    # 缓存的对象
        expires 30d;     # 缓存期限为30天
    }
}

FastCGI 相关参数调优

指定连接到后端FastCGI的超时时间

fastcgi_connect_timeout 300;

Nginx允许FastCGI服务器返回数据的超时时间,即在规定时间内后端服务器必须传完所有的数据,否则Nginx将断开这个连接

fastcgi_send_timeout 240;

Nginx从FastCGI服务器读取响应信息的超时时间,表示连接建立成功后,Nginx等待后端服务器的响应时间

fastcgi_read_timeout 240;

用来读取从FastCGI服务器端收到的第一部分响应信息的缓冲区大小

fastcgi_buffer_size 64K;

设定用来读取从FastCGI服务器端收到的响应信息的缓冲区大小和缓冲区数量

fastcgi_buffers 4 64k;

于设置系统很忙时可以使用的 proxy_buffers大小,默认值是fastcgi_buffers的两倍。

fastcgi_busy_buffers_size 128k;

FastCGI 临时文件的大小,默认值是fastcgi_buffers的两倍。

fastcgi_temp_file_write_size 128k;

开启FastCGI缓存并且为其制定一个名称。个人感觉开启缓存非常有用,可以有效降低CPU负载,并且防止502错误。但是这个缓存会引起很多问题,因为它缓存的是动态页面。具体使用还需根据自己的需求

fastcgi_cache ngx_fcgi_cache;

指定的应答代码指定缓存时间,如上例中将200,302应答缓存一小时,301应答缓存1天,其他为1分钟。

fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;

设置请求几次之后响应被缓存,1表示一次即被缓存

fastcgi_cache_min_uses 1;

义在哪些情况下使用过期缓存,例如错误,超时..

fastcgi_cache_use_stale error timeout invalid_header http_500;

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://maplefix.top/archives/nginx-configuration-and-tuning