Nginx企业级优化
一、配置Nginx隐藏版本号
二、修改Nginx用户与组
三、配置Nginx网页缓存时间
四、实现Nginx的日志切割
五、配置Nginx实现连接超时
六、配置Nginx实现网页压缩功能
七、配置Nginx实现防盗链功能
八、对FPM模块进行参数优化
编译安装Nginx:
[root@nginx ~]# rpm -e httpd --nodeps
[root@nginx ~]# yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
[root@nginx ~]# tar xf nginx-1.6.0.tar.gz -C /usr/src/
[root@nginx ~]# useradd -M -s /sbin/nologin nginx
[root@nginx ~]# cd /usr/src/nginx-1.6.0/
[root@nginx nginx-1.6.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module --with-pcre && make && make install
一、配置Nginx隐藏版本号
在生产环境中,需要隐藏Nginx的版本号,以避免安全漏洞的泄漏。
[root@nginx ~]# /usr/local/nginx/sbin/nginx #启动服务
[root@nginx ~]# curl -I 192.168.108.113
HTTP/1.1 200 OK
Server: nginx/1.6.0
Date: Wed, 19 Jul 2017 15:08:32 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Wed, 19 Jul 2017 15:04:15 GMT
Connection: keep-alive
ETag: "596f74ef-264"
Accept-Ranges: bytes
隐藏的方法:
1、修改源码包
[root@nginx ~]# cd /usr/src/nginx-1.6.0/
[root@nginx nginx-1.6.0]# make clean
rm -rf Makefile objs
[root@nginx nginx-1.6.0]# cd /usr/local/
[root@nginx local]# rm -rf ./nginx/
[root@nginx local]# cd /usr/src/nginx-1.6.0/
[root@nginx nginx-1.6.0]# vim src/core/nginx.h
13 #define NGINX_VERSION "1.1.1"
14 #define NGINX_VER "IIS/" NGINX_VERSION
[root@nginx nginx-1.6.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
[root@nginx nginx-1.6.0]# killall -3 nginx #stop
[root@nginx nginx-1.6.0]# /usr/local/nginx/sbin/nginx #start
[root@nginx nginx-1.6.0]# netstat -anpt | grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6948/nginx
[root@nginx nginx-1.6.0]# curl -I 192.168.108.113
HTTP/1.1 200 OK
Server: IIS/1.1.1
Date: Wed, 19 Jul 2017 15:19:22 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Wed, 19 Jul 2017 15:17:34 GMT
Connection: keep-alive
ETag: "596f780e-264"
Accept-Ranges: bytes
2、修改配置文件
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
server_tokens off;
[root@nginx ~]# /etc/init.d/nginx stop
[root@nginx ~]# /etc/init.d/nginx start
[root@nginx ~]# curl -I 192.168.108.113
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 19 Jul 2017 20:08:31 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Wed, 19 Jul 2017 15:17:34 GMT
Connection: keep-alive
ETag: "596f780e-264"
Accept-Ranges: bytes
如果php配置文件中配置了fastcgi_param SERVER_SOFTWARE选项,则编辑php-fpm配置文件,将fastcgi_param SERVER_SOFTWARE对应值修改为fastcgi_param SERVER_SOFTWARE nginx;
二、修改Nginx用户与组
Nginx运行时进程需要有用户与组的支持,以实现对网站文件读取时进行访问控制。Nginx默认使用nobody用户账号与组账号,一般也要进行修改。
方法1、编译安装时指定
[root@nginx ~]# useradd -M -s /sbin/nologin nginx
[root@nginx nginx-1.6.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
方法2、修改配置文件
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
2 user nginx nginx;
三、配置Nginx网页缓存时间
当Nginx将网页数据返回给客户端后,可设置缓存的时间,以方便在日后进行相同内容的请求时直接返回,以避免重复请求,加快了访问速度,一般针对静态网页进行设置,对动态网页不用设置缓存时间。可在Windows客户端中使用fiddler查看网页缓存时间。
设置方法:
可修改配置文件,在http段、或server段、或者location段加入对特定内容的过期参数。
……
location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
expires 1d;
}
……
四、实现Nginx的日志切割
[root@nginx ~]# vim /opt/fenge.sh
#!/bin/bash
# fenge.sh d=$(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
if [ -f $pid_path ];then
mv /usr/local/nginx/logs/access.log $logs_path/test.com-access.log-$d
kill -USR1 $(cat $pid_path) #杀掉PID
find $logs_path -mtime +30 |xargs rm -f #清除30天以前的日志
else
echo "Error,Nginx is not working!" |tee -a /var/log/messages
fi
[root@nginx ~]# chmod +x /opt/fenge.sh
[root@nginx ~]# crontab -e
0 0 * * * /opt/fenge.sh
五、配置Nginx实现连接超时
在企业网站中,为了避免同一个客户长时间占用连接,造成资源浪费,可以设置相应的连接超时参数,实现控制连接访问时间。
keepalived_timeout:设置连接保持超时时间,一般可只设置该参数,默认为75秒,可根据网站的情况设置,或者关闭,可在http段、server段、或者location段设置。
client_header_timeout:指定等待客户端发送请求头的超时时间。
client_body_timeout:设置请求体读超时时间。 若出现超时,会返回408报错
五、更改Nginx运行进程数
在高并发场景,需要启动更多的nginx进程以保证快速影响,以处理用户的请求,避免造成阻塞。
修改配置文件的worker_processes参数,一般设置为CPU的个数或者核数的2倍
[root@nginx ~]# cat /proc/cpuinfo |grep -c "physical"
1
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
3 worker_processes 1;
默认Nginx的多个进程可能更多的跑在一颗CPU上,可以分配不同的进程给不同的CPU处理,充分利用硬件多核多CPU。在一台4核物理服务器,可以进行下面的配置,将进程进行分配。
worker_cpu_affinity 0001 0010 0100 1000
六、配置Nginx实现网页压缩功能
Nginx的ngx_http_gzip_module压缩模块提供了对文件内容压缩的功能,允许nginx服务器将输出内容发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装。
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
……
38 gzip on; //开启gzip压缩输出
39 gzip_min_length 1k; //用于设置允许压缩的页面最小字节数
40 gzip_buffers 4 16k; //表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来储存gzip压缩结果
41 gzip_http_version 1.1; //设置识别http协议版本,默认是1.1
42 gzip_comp_level 2; //gzip压缩比,1-9等级
43 gzip_types text/plain text/javascript application/x-javascrip t text/css text/xml application/xml application/xml+rss; //压缩类型,是就对哪些网页文档启用压缩功能
44 #gzip_vary on; //选项可以让前端的缓存服务器经过gzip压缩的页面
……
七、配置Nginx实现防盗链功能
源主机设置防盗链
配置说明:
valid_referers 设置信任网站
none 浏览器中referer为空的情况,就直接在浏览器访问图片
blocked referrer不为空的情况,但是值被代理或防火墙删除了,这些值不以http:// 或https://开头
【referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。
rewrite 强制跳转】
location ~* \.(jpg|gif|png|swf)$ {
valid_referers none blocked *.amber.com amber.com;
if ($invalid_referer) {
rewrite ^/ http://www.amber.com/error.jpg;
#return 403;
}
}
如果连接的来源不是*.amber.com、amber.com的域(不区分大小写),则强制跳转到http://www.amber.com/error.jpg,若不设置错误页面,可以返回403报错。
八、对FPM模块进行参数优化
Nginx的PHP解析功能实现如果是交由FPM处理的,为了提高PHP的处理速度,可对FPM模块进行参数跳转。
FPM优化参数:
pm 使用哪种方式启动fpm进程,可以说static和dynamic,前者将产生 固定数量的fpm进程,后者将以动态的方式产生fpm进程
pm.max_children static方式下开启的fpm进程数
pm.start_servers 动态方式下初始的fpm进程数量
pm.min_spare_servers 动态方式下最小的fpm空闲进程数
pm.max_spare_servers 动态方式下最大的fpm空闲进程数
注:以上调整要根据服务器的内存与服务器负载进行调整
示例:
服务器为云服务器,运行了个人论坛,内存为1.5G,fpm进程数为20,内存消耗近1G,处理比较慢
# vim /usr/local/php5/etc/php-fpm.conf
优化参数调整:
pm = dynamic
pm=start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
最终优化后的nginx配置文件
[root@nginx ~]# cat /usr/local/nginx/conf/nginx.conf
user nginx nginx;
worker_processes 2;
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid;
events {
use epoll;
worker_connections 10240;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
client_header_timeout 60;
client_body_timeout 60;
server_tokens off;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain text/javascript application/x-javascrip t text/css text/xml application/xml application/xml+rss; gzip_vary on;
server {
listen 80;
server_name www.amber.com;
charset utf-8;
access_log logs/amber.com.access.log main;
location / {
root /web/amber.com;
index index.html index.htm;
}
location ~*\.(gif|jpg|jpeg|png|bmp|ico)$ {
root /web/amber.com;
expires 1d;
valid_referers none blocked *.amber.com amber.com;
if ($invalid_referer) {
rewrite ^/ http://www.amber.com/error.jpg;
#return 403;
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}