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;

    }

  }

}

posted @ 2017-08-09 17:52  underwaterSwimming  阅读(148)  评论(0编辑  收藏  举报