Nginx如何配置

Nginx 推送动态内容给CGI, FastCGI, 和其它web服务器,比如Apache。返回内容再由Nginx传送给客户端。
本文将带你了解熟悉Nginx的配置

Directives, Blocks, and Contexts

所有的Nginx配置文件都在/etc/nginx/ 目录下。主要的配置文件是/etc/nginx/nginx.conf。

在Nginx内的配置选项称为指示
以组编排的指令被称作为 blocks 或 context。这两个术语是同等的。

‘#’开头的行会被注释,不会被Nginx解析。
如果行内包含指令的话必须以 ‘;’ 结尾,否则Nginx将不能加载配置,并报错。

下面是一个缩略版本的nginx.conf
文件以4个指令开头:user, worker_process, error_log, 和 pid。
这些指令都在block或context外面,所以他们被认为在 main context上。
Event和 http blocks是额外指令的区域,他们也同样存在于main context

/etc/nginx/nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
. . .
}
http {
. . .
}

http Block

http Block 包含处理web流量的指令。这些指令通常被定义为统一的.

下面是Nginx文档给出的可用的http block 列表:

/etc/nginx/nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}

Server Blocks

上面的http block包含 include指令,告诉Nginx网站配置文件放置的地方。

如果你从官方仓库安装Nginx,会有这么一行 /etc/nginx/conf.d/*.conf; 像上面说的http block的那个一样
每个用Nginx部署的网站应该在这目录 /etc/nginx/conf.d/ 有自己的配置文件;命名一般为 example.com.conf
如果想disable它的话,可以改名为example.com.conf.disabled.

如果你从Debian或Ubuntu仓库安装的话,会有这么一行/etc/nginx/sites-enabled/*;
../sites-enabled/文件夹里包含 从 /etc/nginx/sites-available/ 链接过来的配置文件。
如果要disable网站的话,一般是删掉在sites-enabled 上的链接。

一般你都能在 /etc/nginx/conf.d/default.conf 或 etc/nginx/sites-enabled/default找到一个配置的例子供你参考。
不管你从哪个渠道安装,对一个网站,服务器配置文件总会包含一个或多个block,比如:

/etc/nginx/conf.d/example.com.conf

1
2
3
4
5
6
7
8
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
try_files $uri /index.html;
}

监听端口

listen指令 告诉Nginx监听的 hostname/IP 和 TCP端口。
default_server参数是说 这个虚拟的host会回答在80端口上的请求,这个端口将不会回答其它的虚拟host。
第二个statement监听的是IP v6,其它没有什么差别。

Name-Based Virtual Hosting

基于name的虚拟主机

server_name指令允许在一个IP地址上存在多个域名。服务器根据收到的请求header决定域名。

你应该按每个域名来创建一个配置文件,或者每个网站一个配置。这里有些案例:

同时处理example.com 和 www.example.com请求:

/etc/nginx/conf.d/example.com.conf

1
server_name example.com www.example.com;

server_name 指令也可以用 通配符 *.example.com 和 .example.com,两个都会指使服务器处理example.com下的所有子域名:

/etc/nginx/conf.d/example.com.conf

1
2
server_name *.example.com;
server_name .example.com;

处理所有example.开头的域名:

/etc/nginx/conf.d/example.com.conf

1
server_name example.*;

Nginx允许你指定一个无效的域名。Nginx使用HTTP header里的name 来作为域名回答请求,不管domain name是否有效。
如果你用你是用内网的话,使用非域名 hostname是非常有效的。这包括在/etc/hosts配的域名。

Location Blocks

location 设置让Nginx返回服务期内的资源请求。和server_name指令一样,告诉Nginx怎么处理域名的请求。
location指令覆盖指定的文件和文件夹,比如http://example.com/blog/:

/etc/nginx/sites-available/example.com

1
2
3
4
5
location / { }
location /images/ { }
location /blog/ { }
location /planet/ { }
location /planet/blog/ { }

上面的location是一字不差地匹配,它匹配主机segment之后的HTTP请求的任何部分:
Request: http://example.com/

Returns:假设server_name 是example.com, location / 指令会决定这个请求怎么处理
Nginx总是履行最匹配的请求:

Request: http://example.com/planet/blog/http://example.com/planet/blog/about/
Returns: 这个会履行 location /planet/blog/ ,因为 它最匹配这个location,即使/planet/ 同样匹配这个请求。

具体的location匹配可以参考下如下例子:

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
location = / {
# 精确匹配 / ,主机名后面不能带任何字符串
[ configuration A ]
}
location / {
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
# 但是正则和最长字符串会优先匹配
[ configuration B ]
}
location /documents/ {
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration C ]
}
location ~ /documents/Abc {
# 匹配任何以 /documents/Abc 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration CC ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif,jpg或jpeg 结尾的请求
# 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
[ configuration E ]
}
location /images/ {
# 字符匹配到 /images/,继续往下,会发现 ^~ 存在
[ configuration F ]
}
location /images/abc {
# 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
# F与G的放置顺序是没有关系的
[ configuration G ]
}
location ~ /images/abc/ {
# 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
[ configuration H ]
}
location ~* /js/.*/\.js
http://seanlook.com/2015/05/17/nginx-location-rewrite/
location ~ ^/(trucks|cars|planes|system|tools){
# 以trucks開頭或cars。。。
}

顺序 no优先级:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)

Location Root 和 Index

location设置是另一个具有自己的参数block的变量。

一旦Nginx确定了哪个location指令最匹配给定请求,对这个请求的响应就由相关的location指令block的内容确定。
一个例子:

/etc/nginx/sites-available/example.com

1
2
3
4
location / {
root html;
index index.html index.htm;
}

在这个例子中,root 是 在默认Nginx安装路径下的 html 目录。绝对路径是 /etc/nginx/html/.

Request: http://example.com/blog/includes/style.css

Returns: Nginx会尝试寻找放置于/etc/nginx/html/blog/includes/style.css 内的文件

注意,如果需要的话root 你的直接设为绝对路径

index这个参数告诉Nginx如果没有设置路由的话,将返回哪个文件。比如:
Request: http://example.com
Returns: Nginx将尝试返回/etc/nginx/html/index.html 这个文件。
如果index指令设置了多个值得话,Nginx将会按顺序来返回第一个存在的文件。比如如果index.html不存在相关目录的话,然后index.htm将会被返回。如果都不存在则会报404.
这有个更复杂的案例,展示了一组响应域example.com的服务器的location:

/etc/nginx/sites-available/example.com

1
2
3
4
5
6
7
8
9
10
11
12
location / {
root /srv/www/example.com/public_html;
index index.html index.htm;
}
location ~ \.pl$ {
gzip off;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_index index.pl;
fastcgi_param SCRIPT_FILENAME /srv/www/example.com/public_html$fastcgi_script_name;
}

在此示例中,所有以.pl扩展名结尾的资源请求都由第二个location block处理,第二个location block为这些请求指定一个fastcgi处理程序。
否则,Nginx使用第一个location 指令。 资源位于文件系统上的/srv/www/example.com/public_html/。 如果请求中未指定文件名,
Nginx将查找并提供index.html或index.htm文件。 如果找不到索引文件,则服务器将返回404错误。

我们分析下下面几个请求:

Request: http://example.com/

Returns:/srv/www/example.com/public_html/index.html(如果存在)。 如果该文件不存在,它将返回/srv/www/example.com/public_html/index.htm。 如果都不存在,Nginx将返回404错误。

Request: http://example.com/blog/

Returns: /srv/www/example.com/public_html/blog/index.html(如果存在)。 如果该文件不存在,它将返回/srv/www/example.com/public_html/blog/index.htm。 如果都不存在,Nginx将返回404错误。

Request: http://example.com/tasks.pl

Returns: Nginx将使用FastCGI处理程序执行位于/srv/www/example.com/public_html/tasks.pl的文件并返回结果。tasks.pl and return the result.

Request: http://example.com/username/roster.pl

Returns: Nginx将使用FastCGI处理程序执行位于/srv/www/example.com/public_html/username/roster.pl的文件并返回结果。

有问题可以留言,并关注我。谢谢大家。