目录
引言
在企业信息化应用环境中,服务器的安全性和响应速度需要根据实际的情况进行相应的参数配置,达到最优的用户体验。
默认的nginx安装参数只能提供最基本的服务,还需要调整如网页时间、连接超时、网页压缩等相应参数,才能发挥服务器的最大作用
一、Nginx优化
1、隐藏版本号
原因:在很多生产环境中,特定的服务版本号是有明显的安全漏洞的,所以我们为了不那么容易被攻击,所以我们会隐藏版本号来减少被攻击的可能性
查看版本号
curl -I http://192.168.255.180
或
在网页中F12查看开发者工具——选择network——刷新页面——选取请求——选择headlers——看版本号
修改版本号方式
1、修改配置文件
vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; #添加,关闭版本号
}
systemctl restart nginx
curl -I http://192.168.184.70
2、修改源码
vim /opt/nginx-1.12.0/src/core/nginx.h
#define NGINX_VERSION "1.1.1" #修改版本号
#define NGINX_VER "apache" NGINX_VERSION #修改服务器类型
cd /opt/nginx-1.12.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
make && make install
vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server_tokens on;
......
}
systemctl restart nginx
curl -I http://192.168.255.180
2、修改用户和组
1、修改配置文件
vim /usr/local/nginx/conf/nginx.conf
user nginx nginx; #取消注释,修改用户为 nginx ,组为 nginx
systemctl restart nginx
ps aux | grep nginx
2、在编译安装的时候指定用户和组
cd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \ #指定nginx的安装路径
--user=nginx \ #指定用户名
--group=nginx \ #指定组名
--with-http_stub_status_module #启用 http_stub_status_module 模块以支持状态统计
make && make install
3、设置缓存时间
当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天,或者18h,不能用1.5d
}
......
}
}
cd /usr/local/nginx/html
vim index.html
<img src="dog.jpg"/> #插入图片
nginx -t
systemctl restart nginx
4、日志分隔
vim /root/fenge.sh
#!/bin/bash
day=$(date -d "-1 day" "+%Y%m%d") #显示前一天的时间
logs_path="/var/log/nginx"
pid_path="/usr/local/nginx/logs/nginx.pid"
[ -d $logs_path ] || mkdir -p $logs_path #创建日志文件目录
#移动并重命名日志文件
mv /usr/local/nginx/logs/access.log ${logs_path}/test.com-access.log-{$day}
#重建日志文件
kill -HUP $(cat $pid_path)
#删除30天前的日志文件
find $logs_path -mtime +30 -exec rm -rf {} \;
#find $logs_path -mtime +30 | xargs rm -rf
chmod +x /opt/fenge.sh
crontab -e
0 1 * * * /opt/fenge.sh
systemctl restart nginx
netstat -natp |grep nginx
5、连接超时
为避免同一客户端长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间超时参数
Keepalive_timeout设置连接保持超时时间
Client_header_timeout
指定等待客户端发送请求头的超时时间
Client_body_timeout
设置请求体读超时时间
vim /usr/local/nginx/conf/nginx.conf
http {
......
keepalive_timeout 65;
client_header_timeout 80; #等待客户端发送请求头的超时时间,超时会发408错误
client_body_timeout 80; #等待客户端发送请求体的超时时间
......
}
6、更改进程数
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处理,进程数配2 4 6 8分别为0001 0010 0100 1000
systemctl restart nginx
01表示启用第一个cpu内核,10表示启用第二个CPU内核
worker cpu affinity 0110;表示开启两个进程,第一个进程对应着第一个CPU内核,第二个进程对应着第二个CPU内核。
###2核cpu,开启4个进程
worker processes 4;
worker cpu affinity 01 10 01 10;
Ps:开启了四个进程,它们分别对应着开启2个CPU内核
##4个cpu,开启4个进程
worker processes 4;
worker cpu affinity 0001 0010 0100 1000;
Ps:0001表示启用第一个cPu内核,0010表示启用第二个CPU内核,依此类推
7、网页压缩
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; #压缩比率(一般选择中间值便于调节,比值小对应cpu压力较小,对于外
部网络压力较大)
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; #压缩类型,表示哪些网页文档启用压缩功能
......
}
cd /usr/local/nginx/html
上传dog.jpg
vim index.html
<img src="dog.jpg"/>
vim /etc/hosts
echo "192.168.255.180 www.ly.com" >> /etc/hosts
echo "192.168.255.170 www.kgc.com" >> /etc/hosts
浏览器访问 http://www.dog.com
二、盗链和防盗链
1、盗链
服务器正常配置
客户机(盗链端)
echo "192.168.255.180 www.kgc.com" >> /etc/hosts 服务器端的ip和域名
cd /usr/local/nginx/html
vim index.html
<title>Welcome to nginx!</title>
<img src="http://www.kgc.com/dog.jpg"> 链接服务器页面地址
客户机浏览器访问本地地址
curl http://192.168.255.150
2、防盗链
vim /usr/local/nginx/conf/nginx.conf
http {
......
server {
......
location ~* \.(jpg|gif|swf)$ {
valid_referers kgc.com *.kgc.com;
if ( $invalid_referer ) {
rewrite ^/ http://www.kgc.com/error.png;
#return 403;
}
}
......
}
}
3、fpm参数优化
cd /usr/local/php/etc/
cp php-fpm.conf.default php-fpm.conf
vim php-fpm.conf
pid = run/php-fpm.pid
vim /usr/local/php/etc/php-fpm.d/www.conf
#96行
pm = dynamic #fpm进程启动方式,动态的
#107行
pm.max_children=20 #fpm进程启动的最大进程数
#112行
pm.start_servers = 5 #动态方式下启动时默认开启的进程数,在最小和最大之间
#117行
pm.min_spare_servers = 2 #动态方式下最小空闲进程数
#122行
pm.max_spare_servers = 8 #动态方式下最大空闲进程数
#启动php-fpm,不可用于重启
/usr/local/php/sbin/php-fpm -c /usr/local/php/lib/php.ini
#执行第一个命令后,就可以使用下面这条命令查看pid号重启php-fpm
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
netstat -anpt | grep 9000
总结
Nginx擅长处理静态请求服务,理论上可以处理3万到5万的并发量,受到cpu和最大文件打开数影响,正常只有3万左右,受到很多公司欢迎原因主要是开源,也有部分收费的,但是有一点缺陷就是不支持集群
在Nginx中主要的几个模块global全局配置,http配置,server配置,和location配置的URL和路径,主要的模块有status,rewrite,FPM,virtual_host虚拟主机,gzip,tokens off
在日常优化中我们可以从防盗链、隐藏版本(配置文件或者源码、修改用户和组、缓存时间、日志分隔、网页压缩(gzip管理压缩比、最小压缩对象的大小、压缩保存的缓冲区个数和大小、前端缓存是否保存、临时缓存文件/目录的权限调整)、连接超时、FPM、work 工作进程资源分配、虚拟主机(IP/端口/域名)