> 本文为个人使用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;
```
Nginx配置和调优记录