Nginx调优

Nginx概念

  • Nginx ("engine x") 是一个轻量级、高性能的WEB服务器软件和反向代理服务器。
  • Nginx以事件驱动(epoll)的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理、负载平衡。但是Nginx并不支持cgi方式运行,原因是可以减少因此带来的一些程序上的漏洞。所以必须使用FastCGI方式来执行PHP程序。

隐藏nginx版本号

查看别的网站服务器

[root@localhost ~]#  curl -I http://www.baidu.com
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: keep-alive
Content-Length: 277
Content-Type: text/html
Date: Tue, 09 May 2023 06:21:00 GMT
Etag: "575e1f60-115"
Last-Modified: Mon, 13 Jun 2016 02:50:08 GMT
Pragma: no-cache
Server: bfe/1.0.8.18

[root@localhost ~]# curl -I http://www.sina.com.cn
HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Tue, 09 May 2023 06:22:37 GMT
Content-Type: text/html
Content-Length: 138
Connection: keep-alive
Location: https://www.sina.com.cn/
X-Via-CDN: f=sinaedge,s=cnc.beixian.union.197.nb.sinaedge.com,c=117.61.206.65;

隐藏nginx服务器版本号

  • 编译前的优化主要是用来修改程序名等等,目的更改源码隐藏软件名称和版本号 安装zlib-devel、pcre-devel等依赖包。
//上传软件包并解压
 [root@cong11 ~]# ls
anaconda-ks.cfg  nginx-1.10.3.tar.gz
 [root@cong11 ~]# tar -zxvf nginx-1.10.3.tar.gz -C /usr/local/src/
//更改源码隐藏软件名称和版本号
 [root@cong11 ~]# cd /usr/local/src/nginx-1.10.3/  
 [root@cong11 nginx-1.10.3]# vim src/core/nginx.h #修改标红部分
13 #define NGINX_VERSION      "8.8.8"    #修改版本号
14 #define NGINX_VER          "web/" NGINX_VERSION #修改服务器名称
 [root@cong11 nginx-1.10.3]# vim src/http/ngx_http_header_filter_module.c
49 static char ngx_http_server_string[] = "Server: web" CRLF;  #修改标红部分
#修改HTTP头信息中的server字段,防止回显具体版本号
  [root@cong11 nginx-1.10.3]# vim src/http/ngx_http_special_response.c
 #这个文件定义了http错误码的返回,有时候我们页面程序出现错误,Nginx会代我们返回相应的错误代码,回显的时候,会带上nginx和版本号,我们把他隐藏起来.
22 "<hr><center>" NGINX_VER "</center>" CRLF #老版本这里需要修改为web,现在这里不需要修改,因为它调用了NGINX_VER变量
29 "<hr><center>web</center>" CRLF
//安装nginx依赖包
 [root@cong11 nginx-1.10.3]# yum install -y gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel  pcre pcre-devel
//预编译
 #创建nginx运行账户www并加入到www组,不允许www用户直接登录系统。
 [root@cong11 ~]# groupadd www   #添加www组
 [root@cong11 ~]# useradd -g www www -s /sbin/nologin  
 [root@cong11 nginx-1.10.3]#  ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module --user=www --group=www

相关选项说明

  • --with-http_dav_module # nginx 编译时通过加入“--with-http_dav_module”可以启用对WebDav协议的支持。WebDAV (Web-based Distributed Authoring and Versioning) 一种基于 HTTP 1.1协议的通信协议。它扩展了HTTP 1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可直接对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。即ngx_http_dav_module模块用于通过 WebDAV 协议进行文件管理自动化。该模块处理 HTTP 和 WebDAV 的 PUT、DELETE、MKCOL、COPY 和 MOVE 方法。
  • --with-http_stub_status_module #获取Nginx的状态统计信息
  • --with-http_addition_module #向响应内容中追加内容,比如想在站点底部追加一个js或者css,可以使用这个模块来实现,即模块ngx_http_addition_module在响应之前或者之后追加文本内容。
  • --with-http_sub_module # ngx_http_sub_module模块是一个过滤器,它修改网站响应内容中的字符串,比如你想把响应内容中的‘iuwai’全部替换成‘aaaaa‘,这个模块已经内置在nginx中,但是默认未安装,需要安装需要加上配置参数:--with-http_sub_module
  • --with-http_flv_module #该ngx_http_flv_module模块为Flash视频(FLV)文件提供伪流服务器端支持。它会根据指定的 start 参数来指定跳过多少字节,并在返回数据前面附上 FLV 头。 location ~ \.flv$ { flv; } curl localhost/index.flv?start=10 该请求的意思是,从视频文件 index.flv 第10个字节开始读取返回,并在返回的数据上附上 FLV 头。
  • --with-http_mp4_module #模块提供了对 MP4 视频的播放支持,相关的扩展名 .mp4 .m4v .m4a。
  • --with-http_ssl_module #启用ngx_http_ssl_module
  • --with-pcre # 支持正则表达式

注:如果pcre是通过编译安装的话,例如 #tar zxvf /usr/local/src/pcre-8.36.tar.gz -C /usr/local/src/ #cd /usr/local/src/pcre-8.36 #./configure && make && make install 则--with-pcre=/usr/local/src/pcre-8.36 #需要注意,这里指的是源码,用./configure --help | grep pcre查看帮助。

//编译安装
 [root@cong11 nginx-1.10.3]# make && make install
//启动nginx
 [root@cong11 ~]# /usr/local/nginx/sbin/nginx
//查看端口号
 [root@cong11 ~]# netstat -antup | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7423/nginx: master
//测试
 [root@cong11 ~]# curl  -I 192.168.1.11
HTTP/1.1 200 OK
Server: web/8.8.8
Date: Wed, 03 Jul 2019 08:34:09 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Wed, 03 Jul 2019 08:31:22 GMT
Connection: keep-alive
ETag: "5d1c67da-264"
Accept-Ranges: bytes

网站测试

http://192.168.70.106/


配置文件nginx.conf

在Nginx服务器的主配置文件nginx.conf中,包括全局配置、I/O事件配置、HTTP配置这三大块内容,配置语句的格式为”关键字 值;”(末尾以分号表示结束),以”#”开始的部分表示注释。 1)全局配置 由各种配置语句组成,不使用特定的界定标 记。全局配置部分包括运行用户、工作进程数、错误日志、PID存放位置等基本设置。 常用配置项: user nobody;
//运行用户,Nginx的运行用户实际是编译时指定的nginx,若编译时未指定则默认为nobody worker_processes 2; //指定nginx启动的工作进程数量,建议按照cpu数目来指定,一般为它的倍数 worker_rlimit_nofile 102400;
//这个指令是指当一个nginx进程打开的最多文件数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。(通过”ulimit –n 数值”可以修改打开的最多文件数目) error_log logs/error.log; //全局错误日志文件的位置 pid logs/nginx.pid; //PID文件的位置 2)I/O事件配置: 使用”events {}”界定标记,用来指定Nginx进程的I/O响应模型,每个进程的连接数等设置 events { use epoll; //使用epoll模型,对于2.6以上的内核,建议使用epoll模型以提高性能 worker_connections 4096; //每个进程允许的最多连接数(默认为1024),每个进程的连接数应根据实际需要来定,一般在10000以下,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections,具体还要看服务器的硬件、带宽等。 } 3)HTTP配置 使用”http{}”界定标记,包括访问日志、HTTP端口、网页目录、默认字符集、连接保持、以及虚拟主机、PHP解析等一系列设置。其中大部分配置语句包含在子界定标记”server {}”内。 http { #设定媒体类型,include 只是一个在当前文件中包含另一个文件内容的指令。 include mime.types; default_type application/octet-stream; //默认媒体类型足够。 #设定日志格式 log_format main '$remote_addr - Nginx调优_Nginxtime_local] "Nginx调优_nginx_02status Nginx调优_Nginx_03http_referer" ' '"Nginx调优_Nginx_04http_x_forwarded_for"';

#设定access log
access_log logs/access.log main;
keepalive_timeout 65;  //连接保持超时
#设定虚拟主机
server {                //用来配置虚拟主机
   listen  80; //WEB服务的监听设置,可以采用”IP地址:端口”形式
   server_name www.lnmp.com;//网站名,称可以写多个名称,用空格分隔
    location / {    //表示如何匹配后面的路径的
         index index.html; //默认首页
         root html; //网页根目录位置,默认为Nginx安装目录下的html/子目录,root语句用来设置特定访问位置的网页文档路径,根据需要可改为/var/www/html等其他路径。
      }
   charset gb2312;  //网页的默认字符集
   #设定本虚拟主机的访问日志
   access_log logs/www.lnmp.com.access.log main;
   error_page 500 502 503 504  /50x.html; //内部错误的反馈页面
   location = /50x.html {
        root html;
   }
}

}

  • nginx -h -v : show version and exit -V : show version and configure options then exit -t : test configuration and exit -s signal : send signal to a master process: stop, quit, reopen, reload

设置Nginx运行进程个数

Nginx运行进程个数一般我们设置CPU的核心或者核心数x2,如果你不了解,top命令之后按1也可以看出来。也可以查看/proc/cpuinfo文件 [root@cong11 ~]# grep ^processor /proc/cpuinfo | wc -l 4

  • 查看cpu个数 [root@cong11 ~]# top #按1,可以看到我这里是4 核心
  • 设置nginx中进程数 在nginx.conf的全局设置中修改 [root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf 改: worker_processes 1; 为 worker_processes 4; #我这里查看到是4个cpu,修改为4
  • 重载nginx配置文件 [root@cong11 ~]# nginx -s reload
  • 查看nginx进程数 [root@cong11 ~]# ps -axu | grep nginx | grep -v "grep" root 20134 0.0 0.1 46072 1912 ? Ss 20:24 0:00 nginx: master process /usr/local/nginx/sbin/nginx www 50207 0.0 0.1 48580 2076 ? S 20:49 0:00 nginx: worker process www 50208 0.0 0.1 48580 2028 ? S 20:49 0:00 nginx: worker process www 50209 0.0 0.1 48580 2048 ? S 20:49 0:00 nginx: worker process www 50210 0.0 0.1 48580 2076 ? S 20:49 0:00 nginx: worker process

Nginx运行CPU亲和力

  • [root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;

修改系统可以打开的最大文件数:

  • 临时修改 ulimit -n设定系统最多打开的文件数 [root@cong11 ~]# ulimit -n 102400 [root@cong11 ~]# ulimit -n 102400
  • 永久修改 修改linux的软硬件限制文件/etc/security/limits.conf [root@cong11 ~]# vim /etc/security/limits.conf 在文件尾部添加如下代码:
  • soft nofile 102400
  • hard nofile 102400 用户重新登录生效 [root@cong11 ~]# ulimit -n 102400

单个进程允许客户端最大并发连接数

worker_connections 65535; 这个数值一般根据服务器性能和内存来制定,也就是单个进程最大连接数,实际最大并发值就是work进程数乘以这个数。 如何设置,可以根据一个进程启动所占内存,top -u www(www表示nginx程序用户名),但是实际我们填入一个65535,足够了,这些都算并发值,一个网站的并发达到这么大的数量,也算一个大站了! [root@cong11 ~]# top -u www