Nginx配置示例

本节以负载均衡场景下,HTTP短连接场景的4core用例为例,配置nginx.conf文件,参数说明见表1所示。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
user  root;
worker_processes 2;
worker_cpu_affinity
1
10;
error_log /dev/null;
worker_rlimit_nofile 102400;
events {
    worker_connections  102400;
    multi_accept on;
    use epoll;
    accept_mutex off;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    access_log /dev/null;
    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay     on;
    sendfile_max_chunk 512k;
    keepalive_timeout  65;
    keepalive_requests 2000;
    client_header_buffer_size 4k;
    large_client_header_buffers 4 32k;
    server_names_hash_bucket_size 128;
    client_max_body_size 100m;
    open_file_cache max=102400 inactive=40s;
    open_file_cache_valid 50s;
    open_file_cache_min_uses 1;
    open_file_cache_errors on;
   upstream test{
       server 192.168.1.75:10000  ;
       server 192.168.2.75:11000  ;
       server 192.168.1.72:10000 ;
       server 192.168.2.72:11000 ;
       keepalive 300;
        }
   server {
        listen       10000 reuseport;
        server_name  localhost;
        access_log off;
        location / {
            root   html;
            index  index.html index.htm;
                   proxy_pass http://test;
                proxy_connect_timeout 75;
                proxy_read_timeout 300;
                proxy_send_timeout 300;
                proxy_buffer_size 4k;
                proxy_buffers   4 32k;
                proxy_busy_buffers_size 64k;
                proxy_temp_file_write_size 64k;
                proxy_http_version 1.1;
                proxy_set_header Connection "";
                proxy_headers_hash_max_size 51200;
                proxy_headers_hash_bucket_size 6400;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    # HTTPS server
        server {
         listen       20000 ssl reuseport;
         server_name  localhost;
         ssl_certificate      /usr/local/nginx/server_2048.crt;
         ssl_certificate_key  /usr/local/nginx/server_2048.key;
         ssl_session_cache    shared:SSL:1m;
         ssl_session_timeout  5m;
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_ciphers  "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
         ssl_prefer_server_ciphers  on;
         location / {
             root   html;
             index  index.html index.htm;
         }
     }
}

Nginx的配置是区块型的,包括全局配置(如user、worker_processes等)和模块配置(其中events为events模块,http为http模块),每个模块配置中又分为各个区块,如http模块中有server区块,server有location区块。

表1 Nginx基本配置与参数说明

配置模块

参数

说明

配置全局

user root;

定义Nginx运行的用户和用户组。

worker_processes 3;

Nginx进程数,建议设置为等于CPU总核心数。

worker_cpu_affinity

1

10

100;

通过worker_cpu_affinity给每个worker进程绑定一个CPU, 1表示启用core0,10表示启用core1,100表示启动core2,依次类推,100000表示启用core5,1后面有n个0就表示启动core n。

error_log /dev/null;

错误日志文件路径,/dev/null表示关闭Nginx日志。

worker_rlimit_nofile 102400;

指定一个Nginx进程打开的最多文件描述符数目,受系统进程的最大打开文件数量(ulimit-n)限制。

配置events模块

worker_connections 102400;

定义每个进程的最大连接数,受系统进程的最大打开文件数量限制,并发总数是worker_processes和worker_connections的乘积。

multi_accept on;

设置一个进程是否同时接受多个网络连接,如果multi_accept被禁止了,Nginx一个工作进程只能同时接受一个新的连接。

use epoll;

设置工作模式为epoll,除此之外还有select、poll、kqueue、rtsig和/dev/poll模式。

accept_mutex on;

打开accept_mutex,避免了worker争夺资源造成的上下文切换以及try_lock的锁开销。

配置HTTP模块

include mime.types;

文件扩展名与文件类型映射表。

default_type application/octet-stream;

默认文件类型。

access_log /dev/null;

Nginx访问日志路径,/dev/null表示关闭访问日志。

sendfile on;

开启高效文件传输模式,获取文件跨过用户态;.gzip压缩器需要在用户态进行,因此无法和sendfile共存。

tcp_nopush on;

开启防止网络阻塞,返回数据的首个数据包会携带从sendfile中获取大块的数据后才会被发送。

tcp_nodelay on;

开启防止网络阻塞。

sendfile_max_chunk 512k;

限制最大sendfile的文件大小,防止过大的文件占据整个工作进程默认为“无限制”。

keepalive_timeout 65;

设置长连接的超时时间。

keepalive_requests 2000;

设置一个keep-alive连接上可以服务的请求的最大数量。当最大请求数量达到时,连接被关闭。

client_header_buffer_size 4k;

客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。

large_client_header_buffers 4 32k;

设置客户端请求的Header头缓冲区大小:4为个数,32k为大小,表示申请4个32k。默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取。

server_names_hash_bucket_size 128;

保存服务器名字的hash表的大小。

client_max_body_size 100m;

控制全局nginx所有请求报文大小,100MB。

open_file_cache max=102400 inactive=40s;

max设置缓存中的最大元素数,在缓存溢出时,删除最近最少使用(LRU)的元素;inactive定义一个时间,如果在此期间未访问该元素,则从该缓存中删除该元素。

open_file_cache_valid 50s;

多长时间检查一次缓存的有效信息。也就是说即使我一直访问这个文件,50s后会检查此文件的更改信息是否变化,发现变化就更新。

open_file_cache_min_uses 1;

open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件更改信息一直是在缓存中打开的。

open_file_cache_errors on;

启用文件查找错误的缓存。

配置upstream test

(反向代理服务器组test。Nginx会根据配置,将请求分发给组里的某一台服务器。)

server 192.168.1.75:1000;

server 192.168.2.75:11000;

server 192.168.1.73:10000;

server 192.168.2.73:11000;

配置处理最终请求的服务器IP地址及端口。

keepalive 300;

设置Nginx每个worker进程和后端服务器之间的空闲长连接数。

设定主机配置

listen 10000 reuseport;

监测10000端口,http短连接场景建议打开reuseport,长连接可复用。

server_name localhost;

定义使用localhost访问。

access_log off;

关闭本虚拟主机的访问日志。

默认请求

root html;

定义服务器的默认网站根目录位置,root是web根目录。

index index.html index.htm;

定义首页索引文件的名称及顺序。

proxy_pass http://test;

表示将所有请求转发到服务器组test配置的服务器中。

proxy_connect_timeout 75;

设置后端服务器的连接超时时间。

proxy_read_timeout 300;

设置Nginx与后端服务器建立连接后,等待后端服务器的响应时间

proxy_send_timeout 300;

指定请求转移到后端服务器的超时时间,超时Nginx将关闭连接。

proxy_buffer_size 4k;

设置用于保存用户头部信息的代理缓冲区大小。

proxy_buffers 432k;

设置缓冲区的数目和大小。

proxy_busy_buffers_size 64k;

用于当系统负载较大,缓冲区不够用时,可以设置更大的proxy_buffers。

proxy_temp_file_write_size 64k;

用于指定缓存临时文件的大小。

proxy_http_version 1.1;

设置Nginx服务器提供代理服务的http协议版本1.1。

proxy_set_header Connection "";

允许重新定义和添加一些将被转移到被代理服务器的请求头部信息。

proxy_headers_hash_max_size 51200;

存放http报文头的哈希表容量上限。

proxy_headers_hash_bucket_size 6400;

Nginx服务器申请存放http报文头的哈希表容量大小。

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;}

定义错误提示页面。

配置SSL加密

listen 20000 ssl;

监测20000端口。

server_name localhost;

定义使用localhost访问。

ssl_certificate /usr/local/nginx/server_2048.crt;

ssl_certificate证书是公钥,它会被发送到连接服务器的每个客户端。

ssl_certificate_key /usr/local/nginx/server_2048.key;

ssl_certificate_key私钥是用来解密的,所以它的权限要得到保护但nginx的主进程能够读取。当然私钥和证书可以放在一个证书文件中,这种方式也只有公钥证书才发送到client。

ssl_session_cache shared:SSL:1m;

设置SSL会话缓存的类型和大小,shared:SSL:1m表示所有的Nginx工作进程共享SSL会话缓存,1M可以存放约4000个sessions。

ssl_session_timeout 5m;

客户端可以重用会话缓存中SSL参数的过期时间,5分钟。

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

用于启动特定的加密协议。

ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";

选择加密套件。

ssl_prefer_server_ciphers on;

设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。

默认请求

root html;

定义服务器的默认网站根目录位置,root是web根目录。

index index.html index.htm;

定义首页索引文件的名称及顺序。