(1).隐藏nginx版本号

  隐藏版本号可以有效避免黑客根据nginx版本信息,查找对应漏洞进行攻击。

  下载nginx源码包(http://nginx.org/en/download.html)并上传,在源码编译之前修改相应配置文件。

[root@youxi1 ~]# tar zxf nginx-1.16.0.tar.gz -C /usr/local/src/
[root@youxi1 ~]# cd /usr/local/src/nginx-1.16.0/
[root@youxi1 nginx-1.16.0]# vim src/core/nginx.h  //修改软件版本号
#define NGINX_VERSION "7.0.0"  //第13行
#define NGINX_VER "IIS/" NGINX_VERSION  //第14行
//修改HTTP头信息中的connection字段,防止回显具体版本号
[root@youxi1 nginx-1.16.0]# vim src/http/ngx_http_header_filter_module.c
static u_char ngx_http_server_string[] = "Server: IIS" CRLF;  //第49行
//修改nginx报404错误时,不回显版本号,这一步也可以使用自定义404页面代替。
[root@youxi1 nginx-1.16.0]# vim src/http/ngx_http_special_response.c
"<hr><center>IIS</center>" CRLF  //第36行

  再之后就可以正常编译安装了。

//安装依赖包
[root@youxi1 nginx-1.16.0]# yum -y install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel
[root@youxi1 nginx-1.16.0]# useradd -s /sbin/nologin -M nginx  //创建一个nginx专属用户
[root@youxi1 nginx-1.16.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module
--with-http_gzip_static_module --with-pcre
[root@youxi1 nginx-1.16.0]# make && make install
[root@youxi1 nginx-1.16.0]# echo $?
0

  依赖包说明:

    gcc是C语言编辑器,gcc-c++是C++语言编辑器。autoconf和automake是用于configure和make编译的工具。zlib和zlib-devel是nginx提供gzip模块的必要支持。openssl和openssl是nginx提供ssl功能的必要支持。pcre和pcre-devel支持地址重写(rewrite)功能。

  安装组件说明:

    --user=nginx --group=nginx  设置用户和组

    --with-http_ssl_module  支持https(超文本传输安全协议)

    --with-http_realip_module  获取客户端真实IP地址

    --with-http_gzip_static_module  允许发送带有.gz文件扩展名的预压缩文件,而不是普通文件。(用于网页压缩调优)

    --with-pcre  指定pcre库源码位置(源码安装的pcre库需要指定详细地址)

  更多安装组件说明可以参考:nginx编译安装指定参数

  启动nginx,查看是否隐藏了版本号。

[root@youxi1 nginx-1.16.0]# /usr/local/nginx/sbin/nginx
[root@youxi1 nginx-1.16.0]# ps aux | grep nginx
root 10639 0.0 0.1 45960 1120 ? Ss 15:03 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 10640 0.0 0.1 46416 1884 ? S 15:03 0:00 nginx: worker process
root 10642 0.0 0.0 112724 992 pts/0 R+ 15:03 0:00 grep --color=auto nginx
[root@youxi1 nginx-1.16.0]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
success
success
[root@youxi1 nginx-1.16.0]# curl -I 192.168.5.101
HTTP/1.1 200 OK
Server: IIS/7.0.0  //版本号
Date: Sun, 11 Aug 2019 07:04:31 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Sun, 11 Aug 2019 06:30:28 GMT
Connection: keep-alive
ETag: "5d4fb604-264"
Accept-Ranges: bytes

  再使用Windows查看错误时返回的是否是修改过的版本号

(2).修改nginx运行用户

  如果编译时已经使用--user=[username] --group=[groupname],那么其实可以不用指定了。如果编译时没有指定这两个参数,那么可以修改nginx的配置文件来变更nginx的运行用户。

[root@youxi1 nginx-1.16.0]# vim /usr/local/nginx/conf/nginx.conf
user nginx;  //第2行
[root@youxi1 nginx-1.16.0]# /usr/local/nginx/sbin/nginx -s reload

(3).设置nginx运行子进程个数

  nginx运行子进程个数一般设置为CPU的核心数、核心数的两倍或者auto(自动获取),也有设置为(核心数-1)。如果CPU核心数超过8,那么nginx的进程个数设置8就差不多了,子进程个数超过8差距就不是很大了,当然设置auto让程序自动获取也行。

  查看CPU的核心数,使用top命令,然后按1可以调出CPU核心数,我这里是4和

  修改nginx运行子进程个数

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
worker_processes auto;  //第3行
[root@youxi1 ~]# /usr/local/nginx/sbin/nginx -s reload
[root@youxi1 ~]# ps aux | grep nginx
root 1138 0.0 0.0 46092 1948 ? Ss 15:21 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 1490 0.0 0.0 46532 2004 ? S 15:30 0:00 nginx: worker process
nginx 1491 0.0 0.0 46532 2004 ? S 15:30 0:00 nginx: worker process
nginx 1492 0.0 0.0 46532 2004 ? S 15:30 0:00 nginx: worker process
nginx 1493 0.0 0.0 46532 2004 ? S 15:30 0:00 nginx: worker process
root 1497 0.0 0.0 112724 992 pts/0 S+ 15:30 0:00 grep --color=auto nginx

  或者使用pstree查看nginx父进程和子进程的关系

[root@youxi1 ~]# yum -y install psmisc
[root@youxi1 ~]# pstree -p | grep nginx
|-nginx(1138)-+-nginx(1490)
| |-nginx(1491)
| |-nginx(1492)
| `-nginx(1493)

(4).设置nginx的CPU亲和力

  CPU的亲和力,就是把nginx每个子进程绑定到固定的cpu上,从而减少cpu上下文切换导致的额外的开销。

  例如,设置nginx运行子进程个数为2,绑定的CPU为0和2。

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
worker_processes 2;
worker_cpu_affinity 0001 0100;  //如果是8核CPU那么就要8个0。这里的0001是CPU0,0100是CPU2
[root@youxi1 ~]# /usr/local/nginx/sbin/nginx -s reload
[root@youxi1 ~]# ps aux | grep nginx
root 1138 0.0 0.0 46000 1968 ? Ss 15:21 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 1566 0.0 0.0 46436 1920 ? S 16:27 0:00 nginx: worker process
nginx 1567 0.0 0.0 46436 1920 ? S 16:27 0:00 nginx: worker process
root 1569 0.0 0.0 112724 988 pts/0 S+ 16:27 0:00 grep --color=auto nginx
[root@youxi1 ~]# taskset -cp 1566
pid 1566's current affinity list: 0
[root@youxi1 ~]# taskset -cp 1567
pid 1567's current affinity list: 2

  生产环境中,如果不是极致要求一般不配值CPU亲和,或者配置成auto即可。因为有可能会造成资源分配不均。

(5).设置nginx每个子进程打开的最多文件数

  理论上来说,nginx子进程最多打开文件数应该是(ulimit -n)/nginx子进程个数,但是nginx分配请求并不均匀,所以可以将子进程最多打开文件数与ulimit -n的值保持一致。

[root@youxi1 ~]# ulimit -n
1024
[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
worker_rlimit_nofile 1024;  //添加子进程个数下方
[root@youxi1 ~]# /usr/local/nginx/sbin/nginx -s reload

  至于永久修改打开文件最大数量,请查看:Linux系统调优——磁盘I/O(三)

(6).nginx事件处理模型

 1)epoll事件处理模型

  select,poll,epoll都是nginx下的I/O多路复用机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。Epoll 在Linux2.6内核中正式引入,和select和poll相似,其实都是I/O多路复用技术。

  epoll的优势:1、Epoll没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于2048, 一般来说这个数目和系统内存关系很大,具体数目可以cat /proc/sys/fs/file-max察看。2、效率提升,Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll。3、Epoll在这点上使用了“共享内存”,更省内存,效率更高。

 2)如何修改nginx事件处理模型

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
events {  //在文件开头部分有一个events,在内部添加事件处理模型
use epoll;  //nginx默认就是epoll
worker_connections 1024;  //这个是单个子进程并发数量
}
[root@youxi1 ~]# /usr/local/nginx/sbin/nginx -s reload

(7).设置nginx最大并发量

  与nginx设置事件处理模型位置一样,里面的worker_connections是单个子进程并发数量。想要设置nginx最大并发量,就是通过设置单个子进程并发数量和子进程个数来实现。最大并发=单个子进程并发*子进程个数。

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
events {
use epoll;
worker_connections 1024;  //修改这个参数值
}
[root@youxi1 ~]# /usr/local/nginx/sbin/nginx -s reload

  worker_connections是指单个工作进程可以允许同时建立外部连接的数量。无论这个连接是外部主动建立的,还是内部建立的。一个工作进程建立一个连接后,进程将打开一个文件副本。所以这个数量还受限于,操作系统ulimit -n设定的值和nginx的worker_rlimit_nofile的值。一般情况下系统ulimit -n、worker_rlimit_nofile 、最大并发量三者的值是一样的(如果三者不太一致,使用过程中它会以最小的值应用)。

(8).server_name匹配

  server_name是http{}里的server{}里的一个参数,是为虚拟服务器提供识别路径。例如,一台服务器上配置了两个虚拟服务器,通过server_name匹配到特定的server块,之后转到对应的目录或应用服务器。

  server_name的匹配方法:

    1、精准匹配:www.baidu.com

    2、通配符匹配:*.baidu.com或www.baidu.*

    3、正则表达式匹配:~ ^.*\.baidu\.com$  (~表示区分大小写的正则匹配;~*表示不区分大小写的正则匹配)

    4、default或default_server

    5、IP地址

  优先级:精确匹配>左通配符匹配(*.baidu.com)>右通配符匹配(www.baidu.*)>正则表达式匹配>default或default_server。当优先级相同时,遵循自上而下的标准匹配。

   修改server_name的localhost为default

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name default;
location / {
root html;
index index.html index.htm;
}
[root@youxi1 ~]# /usr/local/nginx/sbin/nginx -t  //检测nginx配置文件是否正确
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

(9).location{}匹配

  语法规则:location [ = | ~ | ~* | ^~ ] /uri/ {...}

  语法说明:=表示精确匹配(绝对匹配);~表示区分大小写的正则匹配;~*表示不区分大小写的正则匹配;^~表示URI前半部分匹配,不检测正则(例如:由于nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意空格));!~和!~*是~和~*相反的意思,表示不匹配;另外还有一个最特殊的,当只有一个/时,表示通配,任何请求都会匹配到。

  实例说明

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
#location ~ \.php$ {  //这个就表示匹配以.php结尾。\.是转义。
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

(10).开启高效传输模式

  高效传输模式设置是在http{}下,一般处在开头。

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
include mime.types;  //媒体类型,conf目录下的mime.types文件
default_type application/octet-stream;  //默认媒体类型
sendfile on;  //开启高效传输模式
tcp_nopush on;  //必须在sendfile开启模式下才有效,防止网络堵塞,积极的减少网络报文段的数量

  sendfile参数指定nginx是否调用sendfile函数来输出文件,对于普通应用设为on,如果用来下载等应用磁盘I/O重负担应用,可设置为off。

(11).连接超时时间

  主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的,TCP的三次握手四次挥手等,我们一般断掉的是那些建立连接但是不做事的,也就是从建立了链接开始,但是后续的握手过程没有进行,那么我们的链接处于等待状态的,全部断掉。另外,php建议短连接。

  连接超时设置是在http{}下,一般处在开头。

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
keepalive_timeout 65;  //紧跟该行
tcp_nodelay on;
client_header_timeout 15;
client_body_timeout 15;
send_timeout 15;

  参数说明:

    keepalived_timeout客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接。

    tcp_nodelay也是防止网络阻塞,不过要包涵在keepalived参数才有效。

    client_header_timeout客户端请求头读取超时时间,如果超过设个时间没有发送任何数据,nginx将返回request time out的错误。

    client_body_timeout客户端求主体超时时间,超过这个时间没有发送任何数据,和上面一样的错误提示。

    send_timeout响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx关闭连接。

(12).文件上传限制大小

  在http{}头部添加

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
http{
......
client_max_body_size 10m;  //上限10M
......
}

  

nginx调优(一)的更多相关文章

  1. nginx调优(二)

    nginx调优(一) (1).Fastcgi调优 FastCGI全称快速通用网关接口(FastCommonGatewayInterface),可以认为FastCGI是静态服务和动态服务的一个接口.Fa ...

  2. nginx调优配置

    nginx调优配置 user www www; #工作进程:数目.根据硬件调整,通常等于CPU数量或者2倍于CPU. worker_processes 8; worker_cpu_affinity 0 ...

  3. 记一次单机Nginx调优,效果立竿见影

    一.物理环境 1.系统是Centos 8,系统配置 2核4G,8M带宽,一台很轻的应用服务器. 2.站点部署情况.但站点部署两个实例,占用两个端口,使用nginx 负载转发到这两个web站点.  二. ...

  4. nginx调优buffer参数设置

    内容来自 https://blog.tanteng.me/2016/03/nginx-buffer-params/.有空再详细了解 Nginx性能调优之buffer参数设置 打开Nginx的error ...

  5. nginx 调优

    般来说nginx配置文件中对优化比较有作用的为以下几项:worker_processes 8;1 nginx进程数,建议按照cpu数目来指定,一般为它的倍数.worker_cpu_affinity 0 ...

  6. nginx调优

    Nginx is an open-source Web Server. It is a high-performance HTTP server that uses very low server r ...

  7. Nginx 调优经验记录

    1.2017年连续爆出5.x版本xshell安全问题和intel的cpu设计漏洞 ,此时我就注意到尽量少暴露自己线上使用的工具以及版本.例如:mysql版本,以及缓存层策略,服务器版本等,以下为 隐藏 ...

  8. Linux学习系列之Nginx调优实战

    Nginx配置文件性能微调 全局的配置 user www-data; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofi ...

  9. Nginx调优实战

    Nginx配置文件性能微调 全局的配置 user www-data; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofi ...

随机推荐

  1. MySQL 索引原理及慢查询优化

    MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位 ...

  2. 什么是IAP?如何实现IAP?

    发布时间:2008-09-01 来源:computer00   分享到:   IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User F ...

  3. [TypeScript] Modifier

    TypeScript 2.8 adds the ability for a mapped type to either add or remove a particular modifier. Spe ...

  4. GBDT 算法

    GBDT (Gradient Boosting Decision Tree) 梯度提升迭代决策树.GBDT 也是 Boosting 算法的一种,但是和 AdaBoost 算法不同(AdaBoost 算 ...

  5. Kubernetes 学习16 RBAC

    一.概述 1.前面讲过,kubernetes的授权也是基于插件来实现而且用户访问时某一次操作经由某一授权插件检查能通过后就不再经由其它插件检查.然后由准入控制插件再做进一步后续的准入控制检查.那么在他 ...

  6. 洛谷P1040 加分二叉树题解

    dp即可 \(f[i][j]\)表示i到j的加分 相当于区间dp了 #include<cstdio> using namespace std; int v[50]; int f[55][5 ...

  7. vue-d2admin-axios异步请求登录,先对比一下Jquery ajax, Axios, Fetch区别

    先说一下对比吧 Jquery ajax, Axios, Fetch区别之我见 引言 前端技术真是一个发展飞快的领域,我三年前入职的时候只有原生XHR和Jquery ajax,我们还曾被JQuery 1 ...

  8. 修改windows网络参数,让上网更快

    管理员运行CMD,运行 netsh int tcp show global 查询活动状态... TCP 全局参数 ------------------------------------------- ...

  9. 模板 - 数据结构 - 栈/Stack

    普通的栈大家都会写,STL的栈据说默认实现方式是deque,没关系反正deque跑得飞快. 这里收录的是一些奇怪的栈,当然双栈实现的队列收录在队列里面. 对顶栈 众所周知,栈可以维护一系列前缀和,包括 ...

  10. MySQL:服务无法启动(1067)问题

    打开安装文件下的my.ini 找到: #Path to the database rootdatadir="C:/ProgramData/MySQL/MySQL Server 5.5/dat ...