简介

Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。

Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。

Nginx的稳定性、功能集、示例配置文件和低系统资源的消耗让他后来居上,在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。

配置文件结构

配置文件主要由四部分组成:

main(全局设置)、server(主机设置)、upstream(负载均衡服务器设置)和 location(URL匹配特定位置的设置)。

  1. main全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  2. events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  3. http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  4. server块:配置虚拟主机的相关参数,一个http中可以有多个server。
  5. location块:配置请求的路由,以及各种页面的处理情况。

这四者之间的关系式:server继承main,location继承server,upstream既不会继承其他设置也不会被继承。

配置文件详解

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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#工作进程数,建议设置为CPU的总核数
worker_processes 16;

#全局错误日志定义类型,日志等级从低到高依次为:
#debug | info | notice | warn | error | crit
error_log logs/error.log info;

#记录主进程ID的文件
pid /nginx-1.13.7/nginx.pid;

#一个进程能打开的文件描述符最大值,理论上该值因该是最多能打开的文件数除以进程数。
#但是由于nginx负载并不是完全均衡的,所以这个值最好等于最多能打开的文件数。
#LINUX系统可以执行 sysctl -a | grep fs.file 可以看到linux文件描述符。
worker_rlimit_nofile 65535;

#连接数上限,单个进程允许的最大连接数
events {
worker_connections 65535;
}

#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#文件扩展名与文件类型映射表
include mime.types;

#默认文件类型
default_type application/octet-stream;

#日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

#access log 记录了哪些用户,哪些页面以及用户浏览器、ip和其他的访问信息
access_log logs/access.log main;

#服务器名字的hash表大小
server_names_hash_bucket_size 128;

#客户端请求头缓冲大小。
#nginx默认会用client_header_buffer_size这个buffer来读取header值,
#如果header过大,它会使用large_client_header_buffers来读取。
#如果设置过小HTTP头/Cookie过大 会报400 错误 nginx 400 bad request
#如果超过buffer,就会报HTTP 414错误(URI Too Long)
#nginx接受最长的HTTP头部大小必须比其中一个buffer大
#否则就会报400的HTTP错误(Bad Request)
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;

#客户端请求体的大小
client_body_buffer_size 8m;

#隐藏ngnix版本号
server_tokens off;

#忽略不合法的请求头
ignore_invalid_headers on;

#指定启用除第一条error_page指令以外其他的error_page。
recursive_error_pages on;

#让 nginx 在处理自己内部重定向时不默认使用 server_name 设置中的第一个域名
server_name_in_redirect off;

#开启文件传输,一般应用都应设置为on;若是有下载的应用,则可以设置成off来平衡网络I/O和磁盘的I/O来降低系统负载
sendfile on;

#告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送。
tcp_nopush on;

#告诉nginx不要缓存数据,而是一段一段的发送--当需要及时发送数据时,就应该给应用设置这个属性,
#这样发送一小块数据信息时就不能立即得到返回值。
tcp_nodelay on;

#长连接超时时间,单位是秒
keepalive_timeout 65;

#gzip模块设置,使用 gzip 压缩可以降低网站带宽消耗,同时提升访问速度。
gzip on; #开启gzip

gzip_min_length 1k; #最小压缩大小

gzip_buffers 4 16k; #压缩缓冲区

gzip_http_version 1.0; #压缩版本

gzip_comp_level 2; #压缩等级

gzip_types text/plain text/css text/xml text/javascript application/json application/x-javascript application/xml application/xml+rss; #压缩类型

#upstream作负载均衡,在此配置需要轮询的服务器地址和端口号
#max_fails为允许请求失败的次数,默认为1.
#weight为轮询权重,根据不同的权重分配可以用来平衡服务器的访问率。
#指定要域名对应的WEB项目访问地址
upstream nginx.www.test.cn {
server localhost:3000 max_fails=3 weight=1;
}

#主机配置
server {
#监听端口
listen 90;

#自己指定要跳转的域名
server_name 192.168.1.19;

#反向代理配置,
#将所有请求为http://nginx.www.test.cn的请求全部转发到upstream中定义的目标服务器中。
location / {
#定义首页索引文件的名称
#index index.php index.html index.htm;

#此处配置的域名必须与upstream的域名一致,才能转发。
proxy_pass http://nginx.www.test.cn;

#以下是一些反向代理的配置可删除
proxy_redirect off;

#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#client_max_body_size 10m; #允许客户端请求的最大单文件字节数
#client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
#proxy_connect_timeout 300; #nginx跟后端服务器连接超时时间(代理连接超时)
#proxy_send_timeout 300; #后端服务器数据回传时间(代理发送超时)
#proxy_read_timeout 300; #连接成功后,后端服务器响应时间(代理接收超时)
#proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
#proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
#proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
#proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}

#单独的access_log文件
access_log logs/192.168.1.19.access.log main;

#设定查看Nginx状态的地址
location /NginxStatus{
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file htpasswd;
}

#禁止访问 .htxxx 文件
location ~ /\.ht {
deny all;
}

#字符集
charset utf-8;

#错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /root;
}
}
}