在生产环境中,需要隐藏Nginx的版本号,以避免安全漏洞的泄漏
查看方法
# 主配置文件
[root@lnmp conf]# vim nginx.conf
在http{
}里面添加
server_tokens off;
# 打开浏览器测试 F12
Server: nginx
# 也可以在本地测试 curl -I
[root@lnmp conf]# curl -I http://192.168.188.188/
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 24 Mar 2021 02:04:03 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.38
# 修改源码实现隐藏版本号 (可选)
[root@lnmp nginx]# vim /root/nginx-1.14.2/src/core/nginx.h
#define NGINX_VERSION “1.1.1”,修改版本号为1.1.1
#define NGINX_VER “IIS/”,修改软件类型为IIS
# 重新编译安装,隐藏版本信息
# 重启服务,访问网站使用curl -I 命令检测
# 编译时设置
--user=nginx
--group=nginx
# 修改配置文件
# 原本是 #user nobody; 改成
user nginx nginx;
# 修改主配置文件 在location段加入expires 参数
location ~ \.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ \.(js|css)$
{
expires 1h;
}
# 写入测试页面
# 在index.html里面添加图片
<img src="./mao.jpg"/>
随着Nginx运行时间增加,日志也会增加。为了方便掌握Nginx运行状态,需要时刻关注Nginx日志文件
太大的日志文件对监控是一个大灾难
定期进行日志文件的切割
Nginx自身不具备日志分割处理的功能,但可以通过Nginx信号控制功能的脚本实现日志的自动切割,并通过Linux的计划任务周期性地进行日志切割
# 编写脚本进行日志切割
# vim fenge.sh
#!/bin/bash
# nginx日志分割脚本 by stanZ 2021-3-24
d=$(date -d "-1 day" "+%Y%m%d") # 昨天的日期
logs_path="/var/log/nginx" # 分割后的日志存放文件路径
pid_path="/usr/local/nginx/logs/nginx.pid" # nginx的pid文件路径
[ -d $logs_path ] || mkdir -p $logs_path # 判断存放路径是否存在 如果不存在则创建
mv /usr/local/nginx/logs/access.log ${logs_path}/test.com-access.log-$d # 将nginx产生的日志 重命名后移动到我们新的存放路径
# 用kill -USR1创建新日志文件/usr/local/nginx/logs/access.log
kill -USR1 $(cat $pid_path) # 通过kill信号 重启nginx 产生新的当日文件
find $logs_path -mtime +30 |xargs rm -rf # find超过30天的日志 将其全部删除
# 将脚本放入任务计划
[root@lnmp shell]# crontab -e
1 0 * * * /bin/bash /root/shell/fenge.sh # 每日凌晨第1分钟时候执行
# 将系统任务重启并开机启动
[root@lnmp shell]# systemctl restart crond
[root@lnmp shell]# systemctl enable crond
执行脚本之后 /var/logs/nginx下有了新分割的日志
在企业网站中,为了避免同一个客户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间
超时参数讲解
keepalive_timeout 65 180; //连接保持超时时间,65为服务端超时时间,180为客户端超时时间,单位秒
client_header_timeout 80; //等待客户端发送请求头部的超时时间
client_body_timeout 80; //请求体读超时时间
在高并发场景,需要启动更多的Nginx进程以保证快速响应,以处理用户的请求,避免造成阻塞
可以使用ps aux命令查看Nginx运行进程的个数
# 查看服务器cpu核数
[root@lnmp conf]# cat /proc/cpuinfo |grep -c physical
8
# 修改主配置文件
[root@lnmp conf]# vim nginx.conf
worker_processes 4;
worker_cpu_affinity 01 10 01 10;
# 开启了四个进程,它们分别对应着开启2个CPU内核
# 测试 没重启之前
[root@lnmp conf]# ps aux |grep nginx
root 1653 0.0 0.0 20548 704 ? Ss 22:37 0:00 nginx: master process /usr/local/sbin/nginx
nginx 1655 0.0 0.0 22224 2740 ? S 22:37 0:00 nginx: worker process
nginx 1656 0.0 0.0 22224 2484 ? S 22:37 0:00 nginx: worker process
# 重启后
[root@lnmp conf]# ps aux |grep nginx
root 1771 0.0 0.0 20548 704 ? Ss 23:03 0:00 nginx: master process /usr/local/sbin/nginx
nginx 1773 0.0 0.0 22224 2488 ? S 23:03 0:00 nginx: worker process
nginx 1774 0.0 0.0 22224 2488 ? S 23:03 0:00 nginx: worker process
nginx 1775 0.0 0.0 22224 2488 ? S 23:03 0:00 nginx: worker process
nginx 1776 0.0 0.0 22224 2488 ? S 23:03 0:00 nginx: worker process
详解
Nginx默认没有开启利用多核CPU,我们可以通过增加worker_cpu_affinity配置参数来充分利用多核CPU。CPU是任务处理,计算最关键的资源,CPU核越多,性能就越好。
配置Nginx多核CPU,worker_cpu_affinity使用方法和范例
1. 2核CPU,开启2个进程
worker_processes 2;
worker_cpu_affinity 01 10;
01表示启用第一个CPU内核,10表示启用第二个CPU内核
worker_cpu_affinity 01 10;表示开启两个进程,第一个进程对应着第一个CPU内核,第二个进程对应着第二个CPU内核。
2. 2核CPU,开启4个进程
worker_processes 4;
worker_cpu_affinity 01 10 01 10;
开启了四个进程,它们分别对应着开启2个CPU内核
3. 4核CPU,开户4个进程
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
0001表示启用第一个CPU内核,0010表示启用第二个CPU内核,依此类推
4. 4核CPU,开启2个进程
worker_processes 2;
worker_cpu_affinity 0101 1010;
0101表示开启第一个和第三个内核,1010表示开启第二个和第四个内核
2个进程对应着四个内核
worker_cpu_affinity配置是写在/etc/nginx/nginx.conf里面的。
2核是 01,四核是0001,8核是00000001,有多少个核,就有几位数,1表示该内核开启,0表示该内核关闭。
5. 8核CPU,开户8个进程
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
0001表示启用第一个CPU内核,0010表示启用第二个CPU内核,依此类推
worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
配置完毕后,重启nginx ,执行/etc/init.d/nginx restart
Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能
允许Nginx服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装
可在配置文件中加入相应的压缩功能参数对压缩性能进行优化
压缩模块:ngx_http_gzip_module,默认已安装
压缩功能参数讲解
# 修改主配置文件
在http{
}里面添加
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 5;
gzip_types text/plain;
gzip_vary on;
# 打开网页测试
在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失
Nginx防盗链功能也非常强大。默认情况下,只需要进行简单的配置,即可实现防盗链处理
IP地址 | 域名 |
---|---|
192.168.188.188 | 源主机 |
192.168.188.132 | 盗链主机 |
# 盗链主机设置盗链图片
<img src="http://192.168.188.188/mao.jpg">
# 查看源主机日志
# 发现 192.168.188.132 盗链图片
192.168.188.1 - - [23/Mar/2021:23:24:29 -0400] "GET /mao.jpg HTTP/1.1" 200 136764 "http://192.168.188.132/" "M
ozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0"
# 配置防盗链
# 在对应的server{}里面设置
location ~ \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers 192.168.188.188;
if ($invalid_referer) {
return 403;
}
}
# 配置说明
# valid_referers:设置信任的网站,即能引用相应图片的网站
# none:浏览器中referer为空的情况,就是直接在浏览器访问图片
# blocked:referer不为空的情况,但是值被代理或防火墙删除了,这些值不以http://或者https://开头后面的网址或者域名:referer中包含相关字符串的网址
# if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为1,则执行后面的操作,即进行重写或返回403页面
防盗链成功
Nginx的PHP解析功能实现如果是交由FPM处理的,为了提高PHP的处理速度,可对FPM模块进行参数的调整
FPM模块参数调整,要根据服务器的内存与服务负载进行调整
启动fpm进程方式 有两种
FPM优化参数讲解
Static的方式的参数
Dynamic方式的参数
动态方式因为会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或者VPS上使用。具体最大数量根据 内存/20M 得到。(比如说512M,建议pm.max_spare_servers设置为20(512*0.8/20)。至于pm.min_spare_servers,则建议根据服务器的负载情况来设置,比较合适的值在5~10之间。)
对于比较大内存的服务器来说,设置为静态的话会提高效率。(比如说2GB内存的服务器,可以设置为50;4GB内存可以设置为100等。)
本机实例
# 编辑php-fpm配置文件
[root@lnmp logs]# cd /usr/local/php5/etc
[root@lnmp etc]# vim php-fpm.conf
# 我的主机内存4g 因此这样配置
pm = dynamic # 动态模式
pm.max_children = 40 # 最多40个进程
pm.start_servers = 10 # php-fpm启动时候有10个进程
m.min_spare_servers = 5 # 最小空闲5个进程
pm.max_spare_servers = 10 # 最大空闲10个进程