配置文件的位置:/usr/local/nginx/conf/nginx.conf

user

1
#user www www;

nginx 运行的用户和用户组,默认为 nobody

pid

1
pid logs/nginx.pid;

进程文件配置,默认为 logs/nginx.pid

error_log

1
error_log logs/error.log warn;

错误日志配置。

日志级别可选:debug < info < notice < warn < error < crit

日志级别越高,记录的日志信息越少

worker_processes

1
worker_processes 1;

nginx 对外提供 web 服务的 worder 进程数。通常设置和 cpu 核数的数量相等

worker_rlimit_nofile

1
worker_rlimit_nofile 1024;

一个 worker 进程能打开的文件的最大数目。

理论值应该是系统最多能打开的文件数(在 linux 中执行 ulimit -n 可得到值)与 worker 进程数相

除得到的值,但是 nginx 分配请求并不均匀,建议与 ulimit -n 的值保持一致

events

1
2
3
4
5
6
7
events {
worker_connections 1024;
use epoll;
}

worker_connections

1
worker_connections 1024;

设置单个 worker 进程最大连接数

use

1
use epoll;

设置复用客户端线程的轮询方法

use  [  kqueue  |  rtsig  |  epoll  |  select  |  poll  ]

epoll 是 linux 2.6 以上版本内核中的高性能网络 I / O 模型

如果不设置,nginx 会选择一个最适合你操作系统的模型

http

1
2
3
http {
}

http 服务器配置

include

1
include mime.types;

设置 MIME 类型(资源的媒体类型),通过 http 协议由 web 服务器返回给客户端浏览器,浏览器会自动使用指定应用程序来打开资源文件

mime.types 文件位于 /usr/local/nginx/conf/mime.types

default_type

1
default_type application/octet-stream;

默认的资源文件的媒体类型,application/octet-stream 为任意的二进制数据流传输

log_format

1
2
3
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

日志格式。"log_format  main"  这里的 main 是日志格式的名称,通过不同名称来定义多种日志格式

参数 描述
$remote_addr 客户端 IP 地址
$http_x_forwarded_for 客户端 IP 地址
$remote_user 客户端用户名
$time_local 访问时间和时区
$http_host 请求主机(域名)
$request 请求的 uri 和 http 协议
$http_referer url 跳转来源(从哪个页面链接访问过来的)
$status http 请求状态
$request_time 处理请求的时间
$body_bytes_sent 发送给客户端文件的主体内容大小
$http_user_agent 客户端浏览器信息

access_log

1
access_log logs/access.log main;

配置访问日志。可以指定使用的日志格式,如这里的 main

charset

1
charset UTF-8;

使用的字符集编码

sendfile

1
sendfile on;

通过调用 sendfile 函数(sendfile 是一个系统调用,在内核空间中完成),可以高效的发送静态文件

tcp_nopush

1
tcp_nopush on;

一次性发送数据包。与 tcp_nodelay 配置项互斥,与 sendfile 配合工作

tcp_nodelay

1
#tcp_nodelay on;

每 0.2 秒后立即发送一个数据包,可以有效的防止网络阻塞,当需要及时发送数据时,应该开启它

keepalive_timeout

1
keepalive_timeout 60;

配置长连接的超时时间。服务器将在这个超时时间过后关闭链接

client_header_timeout

1
client_header_timeout 120;

等待客户端发送一个请求头的超时时间,超时 Nginx 返回一个请求超时的状态码(408,Request Timeout)

client_body_timeout

1
client_body_timeout 120;

等待客户端发送一个请求体的超时时间,超时 Nginx 返回一个请求超时的状态码(408,Request Timeout)

send_timeout

1
send_timeout 120;

客户端读取数据的超时时间,超时 Nginx 就会关闭该连接

client_header_buffer_size

1
client_header_buffer_size 16k;

缓存客户端请求头的大小

large_client_header_buffers

1
large_client_header_buffers 4 32k;

缓存客户端请求头的最大大小,此处为 4 个 32K 的大小

gzip

1
gzip on;

采用 gzip 压缩的形式发送数据,可以减少发送的数据量

gzip_min_length

1
gzip_min_length 1k;

大于该值的内容才压缩,0 表示所有的内容都压缩

gzip_buffers

1
gzip_buffers 4 16k;

缓存 gzip 压缩数据的空间大小,此处为 4 个 16K 的大小

gzip_types

1
gzip_types text/plain text/css application/x-javascript application/xml;

只有匹配配置的 MIME 类型的文档内容才会被压缩

nginx 默认会对 text/html 类型进行压缩,此处无需再配,若配置 text/html,nginx 会发出警告:

nginx: [ warn ] duplicate MIME type "text/html"

server_names_hash_bucket_size

1
server_names_hash_bucket_size 128;

服务器名称的 hash 表大小,如果太小,Nginx 无法启动

server

1
2
3
server {
}

虚拟主机配置

listen

1
listen 80;

监听端口

server_name

1
server_name fanlychie.com www.fanlychie.com;

域名,可以配置多个,以空格分开

access_log

1
access_log logs/fanlychie.access.log main;

虚拟主机访问日志。

root

1
root www.fanlychie.com;

网站根目录,用于存放网站静态资源文件。若为相对路径,则是相对于 nginx 安装的目录。如此处的物理路径为 /usr/local/nginx/www.fanlychie.com

location

1
2
3
location / {
}

配置请求处理的方式

语法 描述
/ 通用配置,可匹配任意请求的 url 地址
= 精确匹配 url 地址
~ 区分大小写的正则表达式匹配 url 地址
~* 不区分大小写的正则表达式匹配 url 地址
^~ 禁止正则表达式的普通字串匹配 url 地址

多个 location 匹配 url 地址的优先级:

  1. "=" 被匹配,停止搜索其他匹配

  2. "^~" 被匹配,停止搜索其他匹配

  3. "~" 和 "~*" 按配置文件中出现的先后顺序,一旦匹配,停止搜索其他匹配

  4. 若以上都没有匹配到,则交给 "/" 处理请求

expires

1
2
3
4
5
location ~ \.(js|css)$ {
expires 1d;
}

js 和 css 文件由 nginx 直接提供,缓存一天

如客户端访问 http://www.fanlychie.com/styles/main.css

由于上面已经配置 root  www.fanlychie.com,nginx 会将

/usr/local/nginx/www.fanlychie.com/styles/main.css 文件直接返回给客户端

1
2
3
4
5
location ~ \.(gif|jpg|jpeg|png|ico)$ {
expires 7d;
}

同上面,图片文件缓存 7 天

deny

1
2
3
4
5
location ~* \.jsp {
deny all;
}

禁止直接访问 *.jsp 文件(返回 403 状态码给客户端)

proxy_pass

1
2
3
4
5
6
7
8
9
10
11
location = / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://www.fanlychie.com/index;
}

proxy_pass 配置反向代理

即通过域名访问网站首页,nginx 将请求转发给真实的运用服务器处理,即

http://www.fanlychie.com/index (www.fanlychie.com 是上面配置的 server_name 的名称)

proxy_set_header

设置请求报头域的值

参数 描述
Host 指定请求的服务器的域名和端口号
X-Forwarded-For      用于记录代理 IP 信息
每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源 IP
追加在 X-Forwarded-For 中。
一个 IP 来自 4.4.4.4 的请求,请求头中可能包含这样一行
X-Forwarded-For  :  1.1.1.1,  2.2.2.2,  3.3.3.3
X-Real-IP 用于记录真实发出请求的客户端 IP
上面的例子,如果配置了 X-Read-IP,将会是
X-Real-IP  :  1.1.1.1
Referer url 跳转来源(从哪个页面链接访问过来的)
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
location / {
proxy_pass http://www.fanlychie.com;
proxy_redirect off;
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 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k;
}

proxy_redirect

proxy_redirect 与 proxy_pass 用法类似,proxy_pass 是转发请求,客户端 url 地址不变;

proxy_redirect 是请求重定向,客户端 url 地址发生变化。

client_max_body_size

允许客户端请求的最大单文件字节数

client_body_buffer_size

代理缓冲用户端请求的缓冲区最大字节数

proxy_connect_timeout

代理连接超时时间(nginx 跟后端服务器连接超时时间)

proxy_send_timeout

代理发送超时时间(后端服务器数据回传时间)

proxy_read_timeout

代理接收超时时间(连接成功后,后端服务器响应时间)

proxy_buffers

代理缓冲区的大小

error_page

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
location = /403.html {
root html;
}
location = /404.html {
root html;
}
location = /50x.html {
root html;
}
error_page 403 /403.html;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;

错误页面配置。

upstream

1
2
3
4
5
6
7
upstream www.fanlychie.com {
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}

负载均衡配置

upstream  www.fanlychie.com,此处的 www.fanlychie.com 是上面 server 模块配置的

server_name。server 指定真实的运用服务主机地址,可以配置多个。

nginx 默认采用轮询的策略,将请求平均的分配到各个运用服务主机中,当其中一台服务主机宕机

后,会自动的被剔除,另外一台服务主机仍然能正常提供服务。

weight

1
2
3
4
5
6
7
upstream www.fanlychie.com {
server 192.168.1.102:8080 weight=1;
server 192.168.1.103:8080 weight=2;
}

在轮询的基础上加上权重,数值越大,表示权值越大,nginx 分发的请求越多

用于运用服务器性能不均的情况。当其中一台服务主机宕机后,会自动的被剔除,另外一台服务主

机仍然能正常提供服务

ip_hash

1
2
3
4
5
6
7
8
9
upstream www.fanlychie.com {
ip_hash;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}

每个请求按访问 ip 的 hash 结果分配服务主机

当新的请求到达时,先将用户 ip 通过哈希算法求值,在随后的请求客户端 ip 的哈希值只要相同,

就会被分配至同一个后端服务器,这种调度可以解决 session 共享的问题,但有时会导致分配不均

即无法保证负载均衡

附完整配置

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
163
#user nobody;
pid logs/nginx.pid;
worker_processes 1;
worker_rlimit_nofile 1024;
error_log logs/error.log warn;
events {
worker_connections 1024;
use epoll;
}
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 logs/access.log main;
charset UTF-8;
sendfile on;
tcp_nopush on;
#tcp_nodelay on;
keepalive_timeout 60;
client_header_timeout 120;
client_body_timeout 120;
send_timeout 120;
client_header_buffer_size 16k;
large_client_header_buffers 4 32k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_types text/plain text/css application/x-javascript application/xml;
server_names_hash_bucket_size 128;
upstream www.fanlychie.com {
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
server {
listen 80;
server_name fanlychie.com www.fanlychie.com;
access_log logs/fanlychie.access.log main;
root www.fanlychie.com;
location = / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://www.fanlychie.com/index;
}
location ~ \.(js|css)$ {
expires 1d;
}
location ~ \.(gif|jpg|jpeg|png|ico)$ {
expires 7d;
}
location ~* \.jsp {
deny all;
}
location / {
proxy_pass http://www.fanlychie.com;
proxy_redirect off;
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 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k;
}
location = /403.html {
root html;
}
location = /404.html {
root html;
}
location = /50x.html {
root html;
}
error_page 404 /404.html;
error_page 403 /403.html;
error_page 500 502 503 504 /50x.html;
}
}

附全局变量表

变量 描述
$args 请求的参数
$content_length 请求头中的 Content-length 域的值
$content_type 请求头中的 Content-Type 域的值
$host 请求主机域的值,否则为服务器名称
$http_user_agent 客户端 agent 信息
$http_cookie 客户端 cookie 信息
$request_method 客户端请求的动作,通常为 GET 或 POST
$remote_addr 客户端的 IP 地址
$remote_port 客户端的端口
$remote_user 已经经过 Auth Basic Module 验证的用户名
$request_filename 当前请求的文件路径
$query_string 与 $args 同
$scheme HTTP 方法(如 http,https)
$server_protocol 请求使用的协议,通常是 HTTP/1.0 或 HTTP/1.1
$server_addr 服务器地址,在完成一次系统调用后可以确定这个值
$server_name 服务器名称
$server_port 请求到达服务器的端口号
$request_uri 包含请求参数的原始 URI,不包含主机名,如:"/foo/bar.php?arg=baz"
$uri 不带请求参数的当前 URI,$uri 不包含主机名,如 "/foo/bar.html"
$document_uri 与 $uri 同

附表达式列表

表达式 表达式 描述
-f !-f 判断文件是否存在
-d !-d 判断目录是否存在
-e !-e 判断文件或目录是否存在
-x !-x 判断文件是否可执行