前情提要:Nginx 的编译。对于网页服务器来说,配置的说道可比编译要多不少,因此只用一篇文章可能讲不完(并不是为了多水几篇)。本文主要讲一些简单的通用配置。

Nginx 的配置文件

编译的时候有参数可以指定配置文件的位置,见这里的第 7 行。执行 nginx -V 可以看到当时的编译参数。一般来说常见的位置有 /etc/nginx/nginx.conf/usr/local/var/nginx/nginx.conf 等。

文件结构

nginx.conf 的配置布局是块状的,结构大致如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
### -------------------
## 全局
### -------------------

...

### -------------------
## 网页服务器部分
### -------------------

http {
    ...
    
    # 引入 conf.d 目录下的 .conf 文件
    include conf.d/*.conf;
}

...

全局部分的内容一般可以不用改,其中有不少选项在编译参数中也指定了默认值。我们主要修改的是网页服务器,也就是 http 这部分。为了防止配置文件过大,一般采用拆分配置文件然后引用的办法,在这里就是 include 的那一行。因此我们只需要修改 conf.d 文件夹下的配置文件即可。这里提供一下我使用的 http {} 模板:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    ####################
    ## 使用 br 替代 gzip
    ####################

    #gzip  on;

    brotli on;
    brotli_static on;
    brotli_comp_level 6;
    brotli_buffers 32 8k;
    brotli_types application/javascript application/atom+xml application/rss+xml application/json application/xhtml+xml font/woff font/woff2 image/gif image/jpeg image/png image/svg+xml image/webp image/x-icon image/x-ms-bmp text/css text/x-component text/xml text/plain;

    include conf.d/*.conf;
}

server 配置

我们可以建立一个网页配置文件 conf.d/myserver.conf

一个简单的 server 配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
server {
    listen       80;
    server_name  example.com www.example.com;

    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }

    location /somewhere {
        root   /tmp/nginx;
        index  index.html;
    }
}
  • 每一句配置以英文分号结束。
  • listen 就是监听设置,可以是 IP:端口的形式,也可以只写端口,此时默认监听 IP 为 0.0.0.0。
  • server_name 是虚拟主机名,也就是访问时所用的域名。
  • location 开头的语句块就是路由规则:
    • / 是指匹配访问根目录。
    • root 是在文件系统里的目录。
    • index 是路径下的默认主页。
  • 路由规则可以有若干个,匹配的模式也不少。除了上面这种最长前缀匹配外,还有精准匹配以及正则表达式等,具体可参阅官方文档

不是很懂?看看这几个例子

  • 当你访问 http://www.example.com/ 时:

    • 翻译成(伪)HTTP 请求就是 GET / 并包含 Host: www.example.com 头。
    • 寻找 server_name 含有 www.example.com 的 server。
    • 匹配 / 规则,因此:
      • 服务器的上下文目录为 /var/www/html
      • 没有加具体文件,自动寻找主页 index.html,如果没有就依次匹配后面的 index.htm。如果都没有就返回 404 错误。
      • 本质上浏览器访问到的是服务器上 /var/www/html/index.html 的内容。
  • 当你访问 http://example.com/dir/file.txt 时:

    • 翻译成(伪)HTTP 请求就是 GET /dir/file.txt 并包含 Host: example.com 头。
    • 寻找 server_name 含有 example.com 的 server。
    • 匹配 / 规则,因此:
      • 服务器的上下文目录为 /var/www/html
      • 寻找 /dir/file.txt,如果没有就返回 404 错误。
      • 本质上浏览器访问到的是服务器上 /var/www/html/dir/file.txt 的内容。
  • 当你访问 http://example.com/somewhere/foo/bar.txt 时:

    • 翻译成(伪)HTTP 请求就是 GET /somewhere/foo/bar.txt 并包含 Host: example.com 头。
    • 寻找 server_name 含有 example.com 的 server。
    • 根据最长前缀,匹配到 /somewhere 规则,因此:
      • 服务器的上下文目录为 /tmp/nginx
      • 寻找 foo/bar.txt,如果没有就返回 404 错误。
      • 本质上浏览器访问到的是服务器上 /tmp/nginx/foo/bar.txt 的内容。