nginx配置与性能调优,nginx配置性能调优


nginx的配置文件

    首先,我的nginx是源码编译的,版本是官网是提供的稳定版1.12.0、根据的我编译选项,配置文件被我编译到/etc/nginx目录下。

[root@nginxserver log]# nginx -V
nginx version: nginx/1.12.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx 
--conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid 
--lock-path=/var/lock/nginx.lock --user=nginx --group=nginx 
--with-http_ssl_module --with-http_flv_module --with-http_stub_status_module
--with-http_gzip_static_module --with-pcre --add-module=/opt/rds-json-nginx-module
--add-module=/opt/lua-nginx-module --add-module=/opt/memc-nginx-module
--http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy 
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi
--http-scgi-temp-path=/var/tmp/nginx/scgi --without-select_module

以上是我学习时编译的nginx参数。(只是学习时用。。。)


配置文件在/etc/nginx目录下,其中的每一个配置文件都提供了备份。

首先/etc/nginx/nginx.conf 是主配置文件。

配置文件一共分为了很多块。

1.全局块

内容: 运行nginx的用户组,允许生成的process数,nginx进程pid的路径,日志的存放路径等等。

2.events 块

内容:nginx服务器与用户的网络连接,worker process 下的网络连接序列化,是否允许同时接受多个网络连接,选取哪种事件驱动模型,每个worker process可以同时支持的最大连接数。

3.http块

内容:文件引入,MIME-Type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单个连接请求数上限。

4.server块

内容:类似于虚拟主机

5.location块

内容:具体定义页面


下面重点说一下我的nginx的各个块的配置。

全局块:

daemon off;
user  nginx nginx;
worker_processes  1;
worker_cpu_affinity 0001;

error_log  /var/log/nginx/error.log;
error_log  /var/log/nginx/error.log  notice;
error_log  /var/log/nginx/error.log  info;

pid         /var/run/nginx/nginx.pid;

这个是我的全局块:

因为是运行在docker容器里的,所以daemon off 这个不用管,是不以守护进程的方式运行。

user :指明了可以运行nginx服务器的用户是。

worker process:启动的worker进程数量。


这里需要说一下nginx的运行过程

管理员发出信号,给nginx的master进程。master进程复制启动,终止,维护,监控进程。而worker进程才真正的去处理客户端的请求。



这里的worker进程最好和CPU的核数一样,而worker_cpu_affinity是为每一个进程分配CPU的工作内核。

error.log:和普通的日志一样有分级【debug|info|notice|warn|error|crit|alert|emerg】


这是我的events块:

event 块:

events {
    accept_mutex on;
    multi_accept on;
    use epoll;
    worker_connections  1024;
}


accept_mutex:在《UNIX网络编程》里提到了一个“惊群”问题,就是当某一时刻只有一个网络连接到来的时,多个睡眠进程都会被同时叫醒。如果每次都唤醒很多进程,会很影响系统性能的。而该选项被开启后会将多个nginx的进程接收连接进行序列化,防止多个进程对连接的争抢。

multi_accept:开启后会允许nginx去一次性同时去接收多个新到达的网络连接。

use epoll:epoll模型,异步非阻塞。十分高效,边沿触发的ET。

worker_connections:主要设置允许每一个worker_process的最大连接数。


这是我的http块:

http块:
http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format logstash_json '{ "@timestamp": "$time_local", '
                             '"@fields": { '
                             '"remote_addr": "$remote_addr", '
                             '"remote_user": "$remote_user", '
                             '"body_bytes_sent": "$body_bytes_sent", '
                             '"request_time": "$request_time", '
                             '"status": "$status", '
                             '"request": "$request", '
                             '"request_method": "$request_method", '
                             '"http_referrer": "$http_referer", '
                             '"body_bytes_sent":"$body_bytes_sent", '
                             '"http_x_forwarded_for": "$http_x_forwarded_for", '
                             '"http_user_agent": "$http_user_agent" } }';

    access_log  /var/log/nginx/access.log  logstash_json;

    sendfile       on;  
    sendfile_max_chunk 128k;

    tcp_nopush     on;
    tcp_nodelay    on;

    keepalive_timeout  65;

    gzip  on;
    gzip_min_length  1024;
    gzip_buffers 4 16k;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript text/css application/xml;
    gzip_vary on;

include mime.types:支持的mime类型,这没啥说的,看看都有什么类型的mime吧

log_format:这个是访问日志的格式。而我定义的是json格式,目的是为了以后的日志收集更方便。还有就是美观啊!该日志会记录每一条的访问记录。
{
	"@timestamp": "25/May/2017:07:18:29 +0000",
	"@fields": {
		"remote_addr": "192.168.30.1",
		"remote_user": "-",
		"body_bytes_sent": "0",
		"request_time": "0.000",
		"status": "304",
		"request": "GET / HTTP/1.1",
		"request_method": "GET",
		"http_referrer": "-",
		"body_bytes_sent": "0",
		"http_x_forwarded_for": "-",
		"http_user_agent": "Mozilla/5.0 (Linux; U; Android 7.0; zh-cn; MI 5 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.146 Mobile Safari/537.36 XiaoMi/MiuiBrowser/8.7.8"
	}
}


sendfile:开启高效的文件传输方式。 sendfile_max_chunk:传输的数据量最大的不能超过的值。 tcp_nopush:在网络连接中,数据量很小的话, 就不着急发送数据 tcp_nodelay:在网络连接中,先不着急发送数据,等待数据量稍微大一点再发送数据。 keepalive_timeout服务器对连接保持65s。 keepalive_requests:用于限制用户想nginx服务器发送请求的次数。 gzip:开启gzip压缩 gzip_min_length响应页面数据的上限
gzip_buffers:缓存空间大小 gzip_comp_level:压缩级别 gzip_types:压缩文件的类型
gzip_vary:启用压缩标识
server_tokens    off:404错误页面时,不显示详细的错误信息。

在配置上就说这么多,剩下的配置在后面去讲解。


针对nginx服务器的配置优化

针对nginx的网络方面的优化:
1.net.core.somaxconn = 20000
该参数用于调整系统可以同时发起的TCP连接数,默认为128.当存在高并发场景下,可能会导致链接超时或者重传的问题。
2.net.core.netdev_max_backlog = 20000
该参数用于限制TCP的发送队列的大小
3.net.ipv4.tcp_max_orphans = 16384
该参数是最大允许多少个没有被关联在用户文件句柄上的tcp套接字,主要是为了抵御DDOS攻击。如果内存小就把该值设置的小一点。
4.net.ipv4.tcp_max_syn_backlog = 128
该值是记录尚未接收到客户端的连接请求确认的最大值。
针对文件的优化: 1.fs.file-max = 378900

系统的所有进程一共可以打开的文件数
当然针对文件的打开的数量限制还需要单独限制一下进程所打开的数量,而不是总的打开数量。 那么就使用ulimit来做一些限制吧。
2.ulimit -n 36000 当然想要永久的更改在/etc/security/limits.conf * soft nofile = 32768
* hard nofile = 65536


与事件驱动相关的配置指令: 1.worker_rlimit_sigpending   1024;   <nginx的配置文件中>
nginx服务器的每一个进程拥有的事件信号队列用于暂存客户端请求的发生信号。而这个值就是队列长度


相关内容

    暂无相关文章