Nginx-服务配置与优化
Nginx服务配置与优化
1.Nginx配置文件介绍
1.1 配置文件位置
本次配置的nginx配置位于:/usr/local/nginx/conf/nginx.conf
在忘记配置文件的时候可以通过find命令找到对应地址。
[root@local profile.d]# find / -name nginx.conf
/usr/local/nginx/conf/nginx.conf
/software/nginx-1.14.0/conf/nginx.conf
Nginx 的默认配置文件为 nginx.conf
。
nginx -c xxx.conf
- 以指定的文件作为配置文件,启动 Nginx。
1.2 nginx配置文件典型结构
#main段配置信息
#定义 nginx 运行的用户和用户组
user nginx nginx;
#nginx 进程数,建议设置为等于 CPU 总核心数。
worker_processes 8;
#nginx 默认没有开启利用多核 CPU, 通过增加 worker_cpu_affinity 配置参数来充分利用多核 CPU 以下是 8 核的配置参数
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;
#进程文件
pid /var/run/nginx.pid;
#一个 nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值 ulimit -n)与 nginx 进程数相除,但是 nginx 分配请求并不均匀,所以建议与 ulimit -n 的值保持一致。
worker_rlimit_nofile 65535;
# events段配置信息
events {
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll 模型是 Linux 2.6 以上版本内核中的高性能网络 I/O 模型,如果跑在 FreeBSD 上面,就用 kqueue 模型。
#epoll 是多路复用 IO(I/O Multiplexing) 中的一种方式,但是仅用于 linux2.6 以上内核,可以大大提高 nginx 的性能
use epoll;
############################################################################
#单个后台 worker process 进程的最大并发链接数
#事件模块指令,定义 nginx 每个进程最大连接数,默认 1024。最大客户连接数由 worker_processes 和 worker_connections 决定
#即 max_client=worker_processes*worker_connections, 在作为反向代理时:max_client=worker_processes*worker_connections / 4
worker_connections 65535;
############################################################################
}
# http段配置信息
# 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型
#charset utf-8; #默认编码
server_names_hash_bucket_size 128; #服务器名字的 hash 表大小
client_header_buffer_size 32k; #上传文件大小限制
large_client_header_buffers 4 64k; #设定请求缓
client_max_body_size 8m; #设定请求缓
sendfile on; #开启高效文件传输模式,sendfile 指令指定 nginx 是否调用 sendfile 函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘 IO 重负载应用,可设置为 off,以平衡磁盘与网络 I/O 处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成 off。
autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on; #防止网络阻塞
tcp_nodelay on; #防止网络阻塞
##连接客户端超时时间各种参数设置##
keepalive_timeout 120; #单位是秒,客户端连接时时间,超时之后服务器端自动关闭该连接 如果 nginx 守护进程在这个等待的时间里,一直没有收到浏览发过来 http 请求,则关闭这个 http 连接
client_header_timeout 10; #客户端请求头的超时时间
client_body_timeout 10; #客户端请求主体超时时间
reset_timedout_connection on; #告诉 nginx 关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间
send_timeout 10; #客户端响应超时时间,在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,nginx 就会关闭连接
################################
#FastCGI 相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
###作为代理缓存服务器设置#######
###先写到 temp 再移动到 cache
#proxy_cache_path /var/tmp/nginx/proxy_cache levels=1:2 keys_zone=cache_one:512m inactive=10m max_size=64m;
###以上 proxy_temp 和 proxy_cache 需要在同一个分区中
###levels=1:2 表示缓存级别,表示缓存目录的第一级目录是 1 个字符,第二级目录是 2 个字符 keys_zone=cache_one:128m 缓存空间起名为 cache_one 大小为 512m
###max_size=64m 表示单个文件超过 128m 就不缓存了 inactive=10m 表示缓存的数据,10 分钟内没有被访问过就删除
#########end####################
#####对传输文件压缩###########
#gzip 模块设置
gzip on; #开启 gzip 压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认 1.1,前端如果是 squid2.5 请使用 1.0)
gzip_comp_level 2; #压缩等级,gzip 压缩比,1 为最小,处理最快;9 为压缩比最大,处理最慢,传输速度最快,也最消耗 CPU;
gzip_types text/plain application/x-javascript text/css application/xml;
#压缩类型,默认就已经包含 text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个 warn。
gzip_vary on;
##############################
#limit_zone crawler $binary_remote_addr 10m; #开启限制 IP 连接数的时候需要使用
# server段配置信息
server {
listen 80; # 配置监听的端口
server_name localhost; # 配置的域名
# location段配置信息
location / {
root /usr/share/nginx/html; # 网站根目录
index index.html index.htm; # 默认首页文件
deny 172.168.22.11; # 禁止访问的ip地址,可以为all
allow 172.168.33.44;# 允许访问的ip地址,可以为all
}
error_page 500 502 503 504 /50x.html; # 默认50x对应的访问页面
error_page 400 404 error.html; # 同上
}
}
- main:全局配置,对全局生效;
- events:配置影响 Nginx 服务器与用户的网络连接;
- http:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
- server:配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;
- location:用于配置匹配的 url ;
- upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。
配置文件整体结构为:
1.3 Nginx常用命令
常用到的命令如下:
nginx -s stop 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
nginx -s quit 平稳关闭Nginx,保存相关信息,有安排的结束web服务。
nginx -s reload 因改变了Nginx相关配置,需要重新加载配置而重载。
nginx -s reopen 重新打开日志文件。
nginx -c filename 为 Nginx 指定一个配置文件,来代替缺省的。
nginx -t 不运行,仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
nginx -v 显示 nginx 的版本。
nginx -V 显示 nginx 的版本,编译器版本和配置参数。
在使用命令的时候注意将nginx相关命令加入到系统命令库中.
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
2.Nginx服务优化
在进行优化前,如果可以先通过nginx -V
查看安装自定义配置的模块。
[root@local conf]# nginx -V
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --http-log-path=/data/logs/nginx/access.log --error-log-path=/data/logs/nginx/error.log --with-http_ssl_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_stub_status_module
2.1 隐藏版本号
版本号信息可以通过http模块的配置进行隐藏,从而防止网络攻击根据nginx版本号获知版本漏洞发起攻击。
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; #添加,关闭版本号
......
}
在未进行配置的时候,通过curl -I
查看http信息的头信息。
[root@local profile.d]# curl -I http://192.168.80.20
HTTP/1.1 200 OK
Server: nginx/1.14.0
Date: Mon, 09 May 2022 09:15:12 GMT
Content-Type: text/html
Content-Length: 25
Last-Modified: Mon, 09 May 2022 08:18:31 GMT
Connection: keep-alive
ETag: "6278ce57-19"
Accept-Ranges: bytes
修改配置后,版本号已隐藏
[root@local conf]# curl -I http://192.168.80.20
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 09 May 2022 09:20:20 GMT
Content-Type: text/html
Content-Length: 25
Last-Modified: Mon, 09 May 2022 08:18:31 GMT
Connection: keep-alive
ETag: "6278ce57-19"
Accept-Ranges: bytes
2.2 缓存图片
当Nginx将网页数据返回给客户端后,可设置缓存的时间,以方便在日后进行相同内容的请求时直接返回,避免重复请求,加快了访问速度一般针对静态网页设置,对动态网页不设置缓存时间。
vim /usr/local/nginx/conf/nginx.conf
http {
......
server {
......
location / {
root html;
index index.html index.htm;
}
location ~ \.(gif|jpg|jepg|png|bmp|ico)$ { #加入新的 location,以图片作为缓存对象
root html;
expires 1d; #指定缓存时间,1天
}
......
}
}
查看响应头中包含 Cahce-Control:max-age=86400 表示缓存时间是 86400 秒。也就是缓存一天的时间,一天之内浏览器访问这个页面,都是用缓存中的数据,而不需要向 Nginx 服务器重新发出请求,减少了服务器的使用带宽。
2.3 配置连接超时
HTTP有一个KeepAlive模式,它告诉web服务器在处理完一个请求后保持这个TCP连接的打开状态。若接收到来自同一客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源。占用过多就会影响性能。
vim /usr/local/nginx/conf/nginx.conf
http {
......
keepalive_timeout 65 180;
client_header_timeout 80;
client_body_timeout 80;
reset_timedout_connection on;
send_timeout 10;
......
}
-
keepalive_timeout
指定KeepAlive的超时时间(timeout)。指定每个TCP连接最多可以保持多长时间,服务器将会在这个时间后关闭连接。 Nginx的默认值是65秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。若将它设置为0,就禁止了keepalive 连接。
第二个参数(可选的)指定了在响应头Keep-Alive:timeout=time中的time值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必去关闭连接了。没有这个参数,Nginx 不会发送 Keep-Alive 响应头。 -
client_header_timeout
客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。 -
client_body_timeout
指定客户端与服务端建立连接后发送 request body 的超时时间。如果客户端在指定时间内没有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out)。 -
reset_timedout_connection
告诉 nginx 关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间 -
send_timeout 10
客户端响应超时时间,在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,nginx 就会关闭连接。
以上参数灵活按需设置即可。
2.4 配置进程数(并发数)
在高并发场景,需要启动更多的Nginx进程以保证快速响应,以处理用户的请求,避免造成阻塞。理论上单个Nginx应用服务可以支持50000并发,单根据实际情况和硬件设施的限制,单个Nginx服务提供并发数在30000以下。
Nginx并发数受到全局配置中的worker_processes
和events配置中的worker_connections
参数限制。即max_client=worker_processes*worker_connections
其中worker_processes为Nginx可以使用进程数,一般设置为服务器的cpu内核数,如果cpu有超线程技术,则设置对应的超线程数量,如4核心8线程CPU,该参数设置为8.
Nginx默认没有开启利用多核 CPU, 通过增加 worker_cpu_affinity 配置参数来充分利用多核 CPU 以下是 8 核的配置参数
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
两核心参数配置为
worker_cpu_affinity 01 10;
worker_connection为单个Nginx进程可以处理的连接数。值为1-65535。最大值是由linux单进程最大打开文件数所限制。
该值的查询可以通过下述命令查询。
[root@local conf]# ulimit -n
1024
通过修改/etc/security/limits.conf
可以修改。在该文件加入配置项
* soft nofile 65535
* hard nofile 65535
注意:* 要加到文件里面,以上在limits.conf文件中添加的两句话的含义是
soft(应用软件)级别限制的最大可打开文件数的限制
hard表示操作系统级别限制的最大可打开文件数的限制,
*表示所有用户都生效。
修改完该配置后,该选项并非立即生效,在无法重启的时候需要使用ulimit -n临时配置一下。
[root@local conf]# ulimit -n 65535 #配置修改后无法直接生效,所以在不能重启的情况下使用ulimit -n 数字临时设置
[root@local conf]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 14950
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 14950
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
在完成最后打开文件数的修改后,修改Nginx配置过程应该为。
cat /proc/cpuinfo | grep -c "physical id" #查看cpu核数
ps aux | grep nginx #查看nginx主进程中包含几个子进程
vim /usr/local/nginx/conf/nginx.conf
worker_processes 2; #修改为核数相同或者2倍
worker_cpu_affinity 01 10; #设置每个进程由不同cpu处理,进程数配为4时0001 0010 0100 1000
…………………………
events{
…………
worker_connections 65535;
}
2.5 配置网页压缩(gzip)
Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能。允许Nginx服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装。可在配置文件中加入相应的压缩功能参数对压缩性能进行优化。
在未配置gzip压缩的时候,图片大小为1.74MB。
配置压缩
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
gzip on; #取消注释,开启gzip压缩功能
gzip_min_length 1k; #最小压缩文件大小,防止所有文件都压缩,反而影响服务效率。
gzip_buffers 4 64k; #压缩缓冲区,大小为4个64k缓冲区
gzip_http_version 1.1; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 6; #压缩比率
gzip_vary on; #支持前端缓存服务器存储压缩页面
gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss image/jpg image/jpeg image/png image/gif application/x-httpd-php application/javascript application/json; #压缩类型,表示哪些网页文档启用压缩功能
......
}
开启后,图片压缩为1.28MB,并在请求头上显示gzip。
2.6 配置防盗链
防盗链是指避免其他网站通过网络连接访问服务器上的图片,从而导致主机流量损失。此时我们使用另外一台主机。
首先配置盗链网站。
[root@localhost html]# cat index.html
<img src="http://www.canyun.com/wallhaven-y8lqo7.jpg" /> //获取的是原图
在配置20主机的防盗链设置
vim /usr/local/nginx/conf/nginx.conf
http {
......
server {
......
#~* \.(jpg|gif|swf)$ :这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的文件;
location ~* \.(jpg|gif|swf)$ {
#valid_referers :设置信任的网站,可以正常使用图片;
valid_referers none blocked *.canyun.com canyun.com;
#if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为true,则执行后面的操作,即进行重写,到防盗链图片
if ( $invalid_referer ) {
rewrite ^/ http://www.canyun.com/error.png;
}
}
......
}
}
刷新并清理缓存,查看25主机是否正常跳转防盗链图片。