Nginx 系列(二)——配置入门

前情提要: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 的内容。