nginx 学习简记 2

使用 HTTP 核心模块配置静态 Web 服务器

典型的静态 Web 服务器还会包含多个 server 块和 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
http {
gzip on;
upstream {
...
}
...
server {
listen localhost:80;
...
location /webstatic {
if ... {
...
}
root /opt/webresource;
...
}
location ~* .(jpg|jpeg|png|jpe|gif)$ {
...
}
}
server {
...
}
}

虚拟主机与请求的分发

可以通过 server_name (对应用户请求中的主机域名)并通过 server 块来定义虚拟主机。每个 server 块就是一个虚拟主机,它只处理与之对应的主机域名请求。这样,一台服务器上的 nginx 就能以不同方式处理访问不同主机域名的 HTTP 请求。

监听端口

listen address:port[default_server|[backlog=num|rcvbuf=size|accept_filter=filter|deferred|bind|ipv6only[on|off]|ssl]]

  • 默认: listen 80;
  • 配置块:server

  • default_server: 将所在 server 块作为整个 Web 服务的默认 server 块。如果没有设置这个参数,那么将会以在 nginx.conf 中找到的第一个 server 块作为默认 server 块。当一个请求无法匹配配置文件的所有主机域名时,就会选用默认的虚拟主机

  • backlog=num: 表示 TCP 中 backlog 队列大小。默认为 -1 即不予设置。在 TCP 建立三次握手过程中,进程还没有开始处理监听句柄,这时 backlog 队列将会放置这些链接。但如果 backlog 队列已满,还有新的客户端试图通过三次握手建立 TCP 连接,这时客户端将会建立连接失败
  • bind: 绑定当前端口/地址对,例如 127.0.0.1:8000。只有同时对一个端口监听多个地址时才会生效
  • ssl: 当前监听端口上的连接必须基于 SSL 协议

主机名称

server_name name[...]

  • 默认: server_name "";
  • 配置块: server

server_name 后可以跟多个主机名称。处理 HTTP 请求时, nginx 会取出 header 头中的 Host,与每个 serverserver_name 进行匹配,从而决定由哪一个 server 块处理这个请求。如果 Host 与多个 server 块中的 server_name 都匹配,这时就会根据匹配优先级来选择实际处理的 server 块。匹配优先级如下:

  1. 完全匹配
  2. 通配符在前面的匹配
  3. 通配符在后面的匹配
  4. 正则表达式的匹配

server_names_hash_bucket_sizeserver_names_hash_max_size 用于指定寻找 server name 的 hashtable 桶大小及表大小。

server_name_in_redirect 表示在重定向请求时是否使用 server_name 里配置的第一个主机名替代原请求中的 Host 头部。

location

  • 语法: location [=|~*|^~|@] /uri/ {...}
  • 配置块: server

location 会根据用户请求中的 URI 来匹配 /uri/,如果可以匹配,就用 location {} 块中的配置处理用户请求。匹配规则如下:

  1. = 字符串完全匹配
  2. ~ 大小写敏感匹配
  3. ~* 大小写不敏感匹配
  4. ^~ 前缀匹配
  5. @ 仅用于处理 nginx 内部请求之间的重定向

注意 location 无法直接表示否条件匹配(但可以通过正则做到)。

文件路径的定义

root 方式设置资源路径

  • 语法: root path;
  • 默认: root html;
  • 配置块: http, server, location, if

定义资源文件相对于 HTTP 请求的根目录:

1
2
3
location /download/ {
root /opt/web/html/
}

如果请求 URI 为 /download/index/test.html,那么 Web 服务器将会返回服务器上 /opt/web/html/download/index/test.html

alias 方式设置资源路径

  • 语法: alias path;
  • 配置块: location
1
2
3
location /conf {
alias /usr/local/nginx/conf/;
}

等价于

1
2
3
location /conf {
root /usr/local/nginx/;
}

alias 还可以使用组捕获正则表达式:

1
2
3
location ~ ^/test/(\w+)\.(\w+)$ {
alias /usr/local/nginx/$2/$1.$2;
}

访问首页

  • 语法: index file...;
  • 默认: index index.html;
  • 配置块: http, server, location
1
2
3
4
location / {
root path;
index /index.html /html/index.php /index.php;
}

根据 HTTP 返回码重定向页面

  • 语法: error_page code[code...][=|=answer-code] uri|@named_location
  • 配置块: http, server, location, if

对于某个请求返回错误码,如果匹配 error_page 中的 code,则重定向到新的 URI 中:

1
2
3
error_page 404 /404.html;
error_page 502 /50x.html
error_page 403 http://example.com/xxx.html

如果重定向 URI 后返回的 HTTP 错误码与原来相同,可以通过 = 来更改返回的错误码:

1
2
error_page 404 =200 /empty.gif;
error_page 404 =403 /forbidden.gif;

如果不想修改 URI,只是想让这样的请求重定向到另一个 location 进行处理,那么可以这样设置:

1
2
3
4
5
6
7
location / {
error_page 404 @fallback;
}
location @fallback {
proxy_pass http://backend;
}

这样 404 请求会被反向代理到 http://backend 上游服务器中处理。

recursive_error_pages [on|off] 指定是否允许递归使用 error_page

try_files

  • 语法: try_files path1[path2] uri;
  • 配置块: server, location

try_files 会按照顺序访问每一个 path,如果可以有效读取,就直接向用户返回这个 path 对于的文件结束请求,否则继续向下访问。如果所有 path 都找不到有效的文件,就重定向到最后的参数 uri 上。

1
2
3
4
5
try_files /system/maintenance.html $uri $uri/index.html $uri.html @other
location @other {
proxy_pass http://backend;
}

内存及磁盘资源的分配

  • cliend_body_in_file_only on|clean|off;: HTTP 包体只存储到磁盘文件中
  • client_body_in_single_buffer on|off;: HTTP 包体尽量写到一个内存 buffer 中
  • client_header_buffer_size size;: 存储 HTTP 头部的内存 buffer 大小
  • large_client_header_buffers number size;: 存储超大 HTTP 头部的内存 buffer 大小
  • client_body_buffer_size size;: 存储 HTTP 包体的内存 buffer 大小
  • client_body_temp_path dir-path[level1[level2[level3]]]: HTTP 包体的临时存放目录
  • connection_pool_size size;: TCP 连接内存池的初始大小
  • request_pool_size size: 请求内存池的初始大小

未完待续