[Nginx] – 性能优化 – 配置文件优化 [一]

Nginx帮助文档 
Nginx配置文档

[Nginx] – 性能优化 – 配置文件优化 [一]

摘要

一般来说,软件的漏洞都和版本有关,因此我们应尽量隐藏或清除Web服务队访问的用户显示各类敏感信息(例如:Web软件名称及版本号等信息),这样恶意的用户就很难猜到他攻击的服务器所用的是否是特定漏洞的软件,或者是否有对应的漏洞存在

          首先在此感谢下我的老师-老男孩专家拥有16年一线实战经验,为我们运维班28期所有成员的耐心讲解,未经本人同意禁止转载
博客地址:oldboy

Nginx基本安全优化

1.调整参数隐藏Nginx版本号信息
    一般来说,软件的漏洞都和版本有关,因此我们应尽量隐藏或清除Web服务队访问的用户显示各类敏感信息(例如:Web软件名称及版本号等信息),这样恶意的用户就很难猜到他攻击的服务器所用的是否是特定漏洞的软件,或者是否有对应的漏洞存在。
修改Nginx版本信息

[[email protected] ~]# vim /application/nginx/conf/nginx.conf
http{
    server_tokens off;
}
#我们在http标签端开启即可

没修改之前
[[email protected] ~]# curl -I blog.etiantian.org
HTTP/1.1 200 OK
Server: nginx/1.6.3
Date: Mon, 30 May 2016 11:17:14 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.32
Link: <http://blog.etiantian.org/?rest_route=/>; rel="https://api.w.org/"
修改后结果(需要重启生效)
[[email protected] ~]# curl -I blog.etiantian.org
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 30 May 2016 11:21:33 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.32
Link: <http://blog.etiantian.org/?rest_route=/>; rel="https://api.w.org/"
修改为后浏览器访问404界面也不会出现版本信息

server_tokens参数的官方说明如下:
syntax    server_tokens on|off;   #此行为参数语法,on为开启,off为关闭
default    server_tokens on;        #此行意思是不配置该参数,软件默认情况的结果
context    http,server,location    #此行为server_tokens参数可以放置的位置
参数作用:激活或禁止Nginx的版本信息显示在报错信息里以及server的响应首部位置
Enables or disables emitting of nginx version in error messages and in the Server response header field   #此行是参数的作用原文

2.更改源码隐藏Nginx软件名及版本号

    隐藏了Nginx版本号后,更进一步,可以通过一些手段把web服务软件的名称也给因此,或者更改为其他Web服务软件名迷惑黑客。Nginx模块不支持更改软件名,所以我们需要更改Nginx源代码才能解决。
1.第一步是一次修改3个Nginx源码文件
修改的第一个文件为nginx-1.6.3/src/core/nginx.h
[[email protected] ~]# cd /home/oldboy/tools/nginx-1.6.3/src/core/
[[email protected] core]# vim nginx.
#define NGINX_VERSION      "9.9.9"
#修改为想要的版本号
#define NGINX_VER          "ABCDOCKER/" NGINX_VERSION
#将nginx修改想要修改的软件名称
#define NGINX_VAR          "ABCDOCKER"
#将nginx修改为想要修改的软件名称。
#define NGX_OLDPID_EXT     ".oldbin"
2.第二步修改nginx-1.6.3/src/http/ngx_http_header_filter_module.c的第49行
[[email protected] nginx-1.6.3]# vim src/http/ngx_http_header_filter_module.
static char ngx_http_server_string[] = "Server: ABCDOCKER"    CRLF;
#修改本行,此处的文件是我们Curl 出来显示的名称
3.第三步修改nginx-1.6.3/src/http/ngx_http_special_response.c,对外页面报错时,它会控制是否展示敏感信息。修改28~30行
[[email protected] nginx-1.6.3]# vim src/http/ngx_http_special_response.
 21 static u_char ngx_http_error_full_tail[] =
 22 "<hr><center>"ABC(www.abcdocker.com)"</center>" CRLF
 23 "</body>" CRLF
 24 "</html>" CRLF
 25 ;
 26 
 27 
 28 static u_char ngx_http_error_tail[] =
 29 "<hr><center>ABC(www.abcdocker.com)</center>" CRLF
 30 "</body>" CRLF
 31 "</html>" CRLF

 5.修改完成之后需要重新编译nginx
查看原来编译的参数
[[email protected] nginx-1.6.3]# /application/nginx/sbin/nginx -V
nginx version: nginx/1.6.3
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) 
TLS SNI support enabled
configure arguments: --prefix=/application/nginx-1.6.3/ --user=www --group=www --with-http_ssl_module --with-http_stub_status_module
[[email protected] nginx-1.6.3]# ./configure --prefix=/application/nginx-1.6.3/ --user=www --group=www --with-http_ssl_module --with-http_stub_status_module
提示:需要停止原来的nginx,从新进行编译。如果不想在覆盖原来的编译参数可以选择指定新的目录。
提示:最后还需要make  makeinstall 才会生效
测试:需要开启nginx
[[email protected] application]# curl -I blog.etiantian.org
HTTP/1.1 200 OK
Server: ABCDOCKER
Date: Mon, 30 May 2016 12:07:19 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.32
Link: <http://blog.etiantian.org/?rest_route=/>; rel="https://api.w.org/"
因为我优化了,所以Server:后面除了我设置的字母不会显示版本信息,修改配置文件server_tokens off;  修改为on即可
     重启nginx
[[email protected] application]# curl -I blog.etiantian.org
HTTP/1.1 200 OK
Server: ABCDOCKER/9.9.9
Date: Mon, 30 May 2016 12:09:05 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.32
Link: <http://blog.etiantian.org/?rest_route=/>; rel="https://api.w.org/"

   关闭 server_tokens off;   可以显示我们设置的错误

 说明:
1.提示网站安全,要从最简单、最短板、最低点入手解决问题,门大开着,窗户安装再结实的护栏也没有意义。
2.向有经验的人及优秀的网站公司学习。
3.学习看官方文档,根据一手资料去分析
4.命令输出结果中含有需要过滤或者要保留的内容时,命令自身可能有参数直接实现。

3.更改Nginx服务的默认用户

    为了Web服务更安全,我们要尽可能地改掉软件默认的所有配置,包括端口、用户等。
查看nginx服务对应的默认用户,查看默认配置文件
[[email protected] ~]# grep "#user" /application/nginx/conf/nginx.conf.default 
#user  nobody;
    为了防止黑客猜到这个Web服务用户,我们需要更改成特殊的用户名,但这个用户必须是系统事先存在的
(1)为Nginx服务建立新用户
[[email protected] ~]# useradd nginx -s /sbin/nologin -M
[[email protected] ~]# id nginx
(2)配置Nginx服务,让其使用刚建立的nginx用户
更改ningx服务默认使用的用户方法有两种:
第一种为直接更改配置文件参数,将默认的#user nobody修改如下内容
user nginx nginx;
#在http标签即可
如果注释或不设置上述参数,默认即是nobody用户,不推荐使用。最好采用一个普通用户
第二种为直接在编译nginx软件时指定编译的用户和组
./configure --prefix=/application/nginx-1.6.3/ --user=www --group=www --with-http_ssl_module --with-http_stub_status_module
提示:前文在编译nginx服务时,就是这样带着参数,因此配置文件中加不加参数默认都是nginx用户了。
    通过上述修改后Nginx进程,可以看到worker processes进程对应的用户都变成了nginx

4.优化Nginx服务的worker进程个数

    在高并发、访问量的Web服务场景,需要事先启动好更多的nginx进程,以保证快速响应并处理大量并发用户的请求.
优化Nginx进程对应nginx服务的配置参数如下:
worker_processes  1;
    上述参数调整的是Nginx服务的Worker进程数,Nginx有Master进程和Worker进程之分,Master为管理进程,worker是工作进程
下面介绍Linux服务CPU总核数的方法
[[email protected] ~]$ grep "processor" /proc/cpuinfo |wc -l
1
[[email protected] ~]$ grep -c processor /proc/cpuinfo 
1
#此处的1表示1颗1核的CPU
查看cpu总颗数
[[email protected] ~]$ grep "pysical id" /proc/cpuinfo |sort|uniq|wc -l
1  #对phsical id 去重计算,表示1颗CPU
执行top命令,然后按数字1,即可显示所有的cpu核数,如下

 单核CPU显示如下:

 有关worker_process参数的官方说明如下:
syntax    worker_processes number:#此行为参数语法,number为数量
default    worker_processes 1    #此行意思是不配置该参数,软件默认情况为1
context    main               #此行为worker_processes参数可以放置的位置
worker_processes为定义worker进程数的数量,建议设置为CPU的核数或者cpu核数*2的进程数,具体情况要根据实际业务来进行选择。除了要和CPU核数的匹配外,和硬盘存储的数据以及系统的负载也会有关,设置为CPU的个数或核数是一个好的起始配置

5.优化绑定不同的Nginx进程到不同CPU上

    默认情况Nginx的多个进程有可能跑在某一个或某一核的CPU上,导致Nginx进程使用硬件的资源不均。可以分配不同的Nginx进程给不同的CPU处理,达到充分有效利用硬件的多CPU多核资源的目的。
worker_processes      main               #此行为worker_processes参数可以放置的位置
worker_processes为定义worker进程数的数量,建议设置为CPU的核数或者cpu核数*2的进程数,具体情况要根据实际业务来进行选择。除了要和CPU核数的匹配外,和硬盘存储的数据以及系统的负载也会有关,设置为CPU的个数或核数是一个好的起始配置

5.优化绑定不同的Nginx进程到不同CPU上

    默认情况Nginx的多个进程有可能跑在某一个或某一核的CPU上,导致Nginx进程使用硬件的资源不均。可以分配不同的Nginx进程给不同的CPU处理,达到充分有效利用硬件的多CPU多核资源的目的。
worker_processes  1;
worker_cpu_affinity 0001 0010 worker进程数的数量,建议设置为CPU的核数或者cpu核数*2的进程数,具体情况要根据实际业务来进行选择。除了要和CPU核数的匹配外,和硬盘存储的数据以及系统的负载也会有关,设置为CPU的个数或核数是一个好的起始配置

5.优化绑定不同的Nginx进程到不同CPU上

    默认情况Nginx的多个进程有可能跑在某一个或某一核的CPU上,导致Nginx进程使用硬件的资源不均。可以分配不同的Nginx进程给不同的CPU处理,达到充分有效利用硬件的多CPU多核资源的目的。
worker_processes  1;
worker_cpu_affinity 0001 0010 0100 的个数或核数是一个好的起始配置

5.优化绑定

相关文章
相关标签/搜索