Nginx 优化
1. Nginx日志分割
生产环境中的服务器,由于访问日志增长素的非常快,日志太大会严重影响服务器的效率,同时,为了方便对日志进行分析计算,必须对日志文件进行定时切割,定时切割的方式有 按月切割、按天切割、按小时切割等等。当然了最常用的还是 按天切割。
[root@localhost logs]# pwd
/usr/local/nginx/logs
[root@localhost logs]# mv access.log 20200224.log
[root@localhost logs]# kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
[root@localhost logs]# ls
20200224.log access.log error.log nginx.pid
首先通过 mv 命令将日志文件重新命名 为 20200224.log ,然后发送 kill -USR1 信号给 Nginx 主进程号
PS: Nginx 信号控制
- TERM,INT 快速关闭
- QUIT 从容关闭
- HUP 平滑重启,重新加载配置问价
- USR1 重新打开日志文件,多用于切割日志
- USR2 平滑升级可执行程序
- WINCH 从容关闭工作进程。
2. 修改 Nginx worker_processes
-
在配置文件中修改 worker_processes ,表示CPU核心数, 使用worker_cpu_affinity 与指定CPU绑定
-
worker_cpu_affinity 对应的 多核CPU
-
例子: 使用了两个CPU, 01表示第一个进程使用 第一个CPU,10表示第二个进程使用第二个CPU
worker_processes 2; worker_cpu_affinity 01 10; -
例子: 使用了 4个CPU ,0001表示第一个进程使用第一个CPU,0010第二个进程使用第二CPU,一次类推
worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; -
worker_cpu_affinity详情可参考:https://blog.csdn.net/u011957758/article/details/50959823
-
-
表示有两个CPU,四个进程
- 01 第一个进程使用 第一个cpu, 10 第二个进程使用第二个 CPU, 01 第三个进程使用 第一个CPU …………
worker_processes 2;
worker_cpu_affinity 01 10 01 10;
-
查看CPU核心数
grep processor /proc/cpuinfo | wc -l 2
3. Nginx 事件模型处理优化
nginx的连接处理机制在于不同的操作系统会采用不同的I/O模型,Linux下,nginx使用epoll的I/O多路复用模型
要根据系统类型不同选择不同的事务处理模型,选择有“use [ kqueue | rtsig |epoll |dev/pool |select |pllo ];”我们使用的是Centos7.3的linux,因此将nginx的事件处理模型调整为epoll模型。
- worker_connections 表示每个进程的并发连接数,默认为 1024
events {
worker_connections 4069;
use epoll;
}
4. 优化Nginx worker 进程打开的最大文件数
- worker_rlimit_nofile 65535;
- worker 进程打开的最大文件数
worker_rlimit_nofile 65535;
-
程序限制只能打开1024个文件
使用
ulimit -n 65535调整一下或者永久调整打开文件数 可在启动文件/etc/rc.d/rc.local末尾添加(在/etc/sysctl.conf末尾添加fs.file-max=xxx无效)
5. 开启高效文件传输模式
- 设置参数 sendfile on;
- sendfile参数用于开启文件的高效传输模式
- 同时将tcp_nopush和tcp_nodelay两个指令设置为on,可防止网络及磁盘i/o阻塞,提升nginx工作效率
http {
sendfile on; #放在http,server,location都可以
#tcp_nopush on; 防止网络以及磁盘I/O阻塞(减少网络使用量)
tcp_nodelay on; 防止网络以及磁盘I/O祖册(发送数据时,内个将多个包合成一个包进行发送,,减少I/O消耗)
}
6. FastCGI 参数调优
-
当LNMP 组合工作时,用户通过浏览器输入域名请求Nginx web 服务
- 如果请求的是静态资源,则有Nginx解析后直接返回给用户
- 如果是动态请求,那么Nginx就会通过 FastCGI接口发送给PHP引擎服务(php-fpm)进行解析,如果这个动态数据需要读取数据库数据,那么PHP就会继续请求MySQL的数据,将读取的数据,最后返回给Nginx
-
在 Linux 中,FastCGI 接口为 socket,这个socket可以是文件、也可以是ip socket
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
fastcgi_connect_timeout 240; # Nginx服务器和后端FastCGI服务器连接的超时时间
fastcgi_send_timeout 240; # Nginx允许FastCGI服务器返回数据的超时时间,即在规定时间内后端服务器必须传完所有的数据,否则Nginx将断开这个连接
fastcgi_read_timeout 240; # Nginx从FastCGI服务器读取响应信息的超时时间,表示连接建立成功后,Nginx等待后端服务器的响应时间
fastcgi_buffer_size 64k; # Nginx FastCGI 的缓冲区大小,用来读取从FastCGI服务器端收到的第一部分响应信息的缓冲区大小
fastcgi_buffers 4 64k; # 设定用来读取从FastCGI服务器端收到的响应信息的缓冲区大小和缓冲区数量
fastcgi_busy_buffers_size 128k; # 用于设置系统很忙时可以使用的 proxy_buffers 大小
fastcgi_temp_file_write_size 128k; # FastCGI 临时文件的大小
# fastcti_temp_path /data/ngx_fcgi_tmp; # FastCGI 临时文件的存放路径
fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g; # 缓存目录
server {
listen 80;
server_name www.tianci.com;
location / {
root html/www;
index index.html index.htm;
}
location ~ .*\.(php|php5)?$ {
root html/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_cache ngx_fcgi_cache; # 缓存FastCGI生成的内容,比如PHP生成的动态内容
fastcgi_cache_valid 200 302 1h; # 指定http状态码的缓存时间,这里表示将200和302缓存1小时
fastcgi_cache_valid 301 1d; # 指定http状态码的缓存时间,这里表示将301缓存1天
fastcgi_cache_valid any 1m; # 指定http状态码的缓存时间,这里表示将其他状态码缓存1分钟
fastcgi_cache_min_uses 1; # 设置请求几次之后响应被缓存,1表示一次即被缓存
fastcgi_cache_use_stale error timeout invalid_header http_500; # 定义在哪些情况下使用过期缓存
fastcgi_cache_key http://$host$request_uri; # 定义 fastcgi_cache 的 key
}
}
}
7. 对连接进行优化
-
开启长连接状态下,客户端不进行任何操作,则断开长接连,避免客户端浪费系统资源
1) 将无用连接尽快超时,保证服务器资源高效使用
2) 当连接诶较多是,及时断掉空闲连接诶,保护服务器资源高可用状态
keepalive_timeout 65; # 保持连接的超时时间
client_header_timeout 30; # 设置读取客户机请求头部数据的超时时间
## 如果在读取客户端头部数据请求信息过多时,没有在规定时间内读取完成,返回给客户端408 服务端超时;;以下选项一样
client_body_timeout 30; # 设置读取客户机请求主体的超时时间
send_timeout 30; # 用于指定响应客户端的超时时间
client_max_body_size 1M; # 设置客户端请求主体的最大体积
8. 压缩文件
-
1) 提升用户体验,发送给用户的数据小,打开网页速度更快
2)节约网站带宽成本,减少流量损失
3)选择压缩或者不压缩的内容
gzip on; # 开启压缩功能
gzip_min_length 1k # 允许压缩的最小字节数
gzip_comp_level [1-9] # 设置压缩比,压缩比越大处理文件的速度越慢,反之越快;;一般设置为6
gzip_varry on; # 可以让前端的缓存服务器经过gzip压缩页面
gzip_types text/plain application/x-javascript test/css application/xmll
# 选择将要压缩的文件类型;; test/html页面总是被压缩(默认)
9. Rewrite 跳转
-
在 server 进行添加跳转模块,可以让访问直接跳转到指定页面
- http { server { rewrite } }
-
正则表达式:
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结束位置
- 匹配*前面的字符串0次或多次
? 匹配?前面 的字符零次或一次
permanent 返回301永久跳转
redirect 返回302临时跳转,浏览器显示跳转后的URL地址
1) 修改配置文件
[root@localhost nginx]# pwd
/usr/local/nginx
[root@localhost nginx]# vim conf/nginx.conf
server {
listen 80;
server_name www.haha.com;
……
}
server {
listen 80;
server_name www.tianci.com;
rewrite ^/(.*) http://www.haha.com/$1 permanent;
# 凡是访问 www.cjk.com域名的的任何内容都将跳转至 www.haha.com网页,
location / {
proxy_pass http://www_server_pools;
}
2) 添加DNS 解析
[root@localhost nginx]# echo "1.1.1.101 www.haha.com" >> /etc/hosts
3) 重启服务
killall nginx
nginx
10. 通过 location 模块指定访问对应URL 获取到不同的结果
-
location
根据用户请求的URL执行不同的应用( URL本地址)
server {
listen 80;
server_name www.aaa.com;
root /var/www/aaa;
location / {
return 401;
}
location = / {
return 402;
}
location /documents/ {
return 403;
}
location ^~/images/ {
return 404;
}
# 当用户访问 域名返回 401(没有权限)
# 当用户访问域名下的目录返回 402
# 当用户访问域名下的 documents 返回 403(j禁止访问)
# 当用户访问域名下的 images 返回 404(网页不存在)
11. 隐藏服务的版本号与服务标识
- 在访问web服务器时显示出来的版本号,容易被黑客找到对应的版本漏洞攻击web服务器
1) 隐藏版本号
- 查看Nginx 默认显示的版本号
- 这样很容被人攻击
[root@localhost ~]# curl -I 127.0.0.1
HTTP/1.1 404 Not Found
Server: nginx/1.12.2
Date: Sat, 21 Mar 2020 06:01:07 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
- 修改 Nginx 配置文件
- 进入nginx配置文件的目录,在
http { }段里加上`server_tokens off;
- 进入nginx配置文件的目录,在
http {
server_tokens off;
include mime.types;
default_type application/octet-stream;
- 如果有PHP,则需要隐藏在 PHP信息中的版本号
- 修改 fastcgi_params文件
- 将里面的
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;改为fastcgi_param SERVER_SOFTWARE nginx;
- 将里面的
- 修改 fastcgi_params文件
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version
改为
fastcgi_param SERVER_SOFTWARE nginx;
- 重启nginx
killall nginx
nginx
- 再次查看
- 我们会发现版本信息,没有了,但是还有Nginx标识
[root@localhost ~]# curl -I 127.0.0.1
HTTP/1.1 404 Not Found
Server: nginx
Date: Sat, 21 Mar 2020 06:03:36 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
2) 修改 Nginx 标识与版本信息
- 修改源码文件中的 src/core/nginx.h
- 加入把Nginx 改为 Tomcat
[root@localhost ~]# cd /usr/src/nginx-1.12.2/
[root@localhost nginx-1.12.2]# vim src/core/nginx.h
/*
* Copyright (C) Igor Sysoev
* Copyright (C) Nginx, Inc.
*/
#ifndef _NGINX_H_INCLUDED_
#define _NGINX_H_INCLUDED_
#define nginx_version 1012002
#define NGINX_VERSION "999.999.999"
# 修改版本号
#define NGINX_VER "Tomcat/" NGINX_VERSION
# 修改 Nginx 标识
#ifdef NGX_BUILD
#define NGINX_VER_BUILD NGINX_VER " (" NGX_BUILD ")"
#else
#define NGINX_VER_BUILD NGINX_VER
#endif
#define NGINX_VAR "NGINX"
#define NGX_OLDPID_EXT ".oldbin"
#endif /* _NGINX_H_INCLUDED_ */
- 重新编译安装即可
make install
-
注意 如果 server_tokens 设置为 OFF ,则不会显示效果,需要把server_tokens 去掉
-
查看
[root@localhost ~]# curl -I 127.0.0.1
HTTP/1.1 404 Not Found
Server: Tomcat/999.999.999
Date: Sat, 21 Mar 2020 06:14:26 GMT
Content-Type: text/html
Content-Length: 175
Connection: keep-alive
12. 配置 Nginx防盗链
-
防盗链是其他网站未经许可,通过自身网站程序非法调用其他网站的资源,然后在自己网页上显示这些调用的资源,使得被盗链路的那一段消耗资源带宽。
-
通过 匹配后缀实现防盗
location ~ .*\.(gif|jpg|jpeg|png|bm|swf|flv|rar|zip|gz|bz2)$ {
# 指定需要使用防盗链的媒体资源
access_log off;
# 不记录日志
expires 15d;
# 设置缓存时间
valid_referers none blocked *.test.com *.abc.com;
# 表示仅允许这些域名访问上面的媒体资源
if ($invalid_referer) {
# 如果域名不是上面指定的地址就返回403
return 403
}
}
- 通过绑定目录 实现防盗
location /images {
root /web/www/img;
vaild_referers none blocked *.spdir.com *.spdir.top;
if ($invalid_referer) {
return 403;
}
}
本文详细介绍了Nginx服务器的优化策略,包括日志管理、性能调优、事件模型优化、连接管理、压缩技术、防盗链设置等关键环节,旨在提高Nginx的运行效率和服务质量。

1359

被折叠的 条评论
为什么被折叠?



