这里使用的是 Centos 7 和 Nginx 1.16.1。

以下命令都使用 root 用户执行。

安装

使用 yum 安装 Nginx:

1
$ yum install nginx

如果不赶时间的话可以从源码安装 Nginx,可查看 Nginx 的这篇安装文档,或 源码安装 Nginx

安装完之后,配置文件路径就在 /etc/nginx/nginx.conf

打开这个文件我们可以看到已经有一些默认配置了:

1
2
3
4
5
6
http {
......
server {
......
}
}

先启动 Nginx

1
2
3
4
5
6
$ nginx
$ ps -ef | grep nginx
root 1212 1 0 15:45 ? 00:00:00 nginx: master process nginx
nginx 1213 1212 0 15:45 ? 00:00:00 nginx: worker process
nginx 1214 1212 0 15:45 ? 00:00:00 nginx: worker process
root 1216 1084 0 15:45 pts/0 00:00:00 grep --color=auto nginx

可以发现 Nginx 启动了一个 master 进程和两个 worker 进程,因为 Nginx 使用的是 master-worker 进程模型。

Nginx 进程已经启动了,我们可以尝试发起请求:

1
2
3
4
5
6
7
8
9
10
$ curl -I localhost:80
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Wed, 04 Dec 2019 07:55:17 GMT
Content-Type: text/html
Content-Length: 4833
Last-Modified: Fri, 16 May 2014 15:12:48 GMT
Connection: keep-alive
ETag: "53762af0-12e1"
Accept-Ranges: bytes

基本的块和指令

root 指令

root 用于指定站点或者某个 URI 的根目录,默认配置中的 root 指向了 /usr/share/nginx/html 目录,当我们访问 localhost:80 或者公网 IP 访问 80 端口时,Nginx 就会返回 /usr/share/nginx/html 目录下的 index.html 文件。默认使用的是该目录下 index.html 的文件,默认读取文件可以用 index 指令修改。

listen 指令

listen 指令用在 server 块中指定监听的端口,一般 http 监听 80 端口,https 监听 443 端口

server_name 指令

如果有域名 DNS 指向本服务器的话需要填写该域名:

1
2
3
4
5
server {
listen 80;
server_name xmodules.xyz;
....
}

location 块

location 块可以指定某个 URI 链接使用的配置:

1
2
3
4
5
6
server {
location /en {
root /my/other/path;
index index.html;
}
}

这样访问 /en 路径时就会返回 /my/other/path/index.html 文件。

include 指令

通常我们不会将所有配置放在同一个配置文件,我们可以使用 include 指令,默认的配置文件中已经使用了 include 指令:

1
include /etc/nginx/default.d/*.conf;

我们可以在 /etc/nginx/default.d/ 目录下新建文件,用于其他的配置:

1
2
3
$ cd /etc/nginx/default.d/
$ touch xmodules.xyz.conf
$ vim xmodules.xyz.conf

输入以下的配置:

1
2
3
4
5
6
7
8
9
server {
listen 80;
server_name xmodules.xyz;

location / {
root /my/file/path;
index index.html;
}
}

这样就可以把很多的服务分开配置。

常用配置

反向代理

通常我们部署 Node.js 服务时会使用 Nginx 或者其他服务器软件做反向代理。当用户发起请求到服务器时,通过 Nginx 的转发,把 HTTP 请求转发到 Node.js 服务中进行处理和响应。

与反向代理相对的是正向代理(或者直接叫代理),用户请求到我们服务器的时候把 HTTP 请求转发到第三方或者外部的服务,等待外部的服务响应,我们再把响应体返回给用户。

一般配置反向代理会把内部变量也转发过去:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
listen 80;
server_name mydomain.com;

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HTTP_CLIENT_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-host $host;
proxy_set_header Host $http_host;
proxy_pass http://localhost:8080;
}

location /other/service {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HTTP_CLIENT_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-host $host;
proxy_set_header Host $http_host;
proxy_pass http://localhost:8081;
}
}

上面的代码表示监听 80 端口,如果用户请求的是 mydomain.com 域名的链接(除了 /other/service/*),则把 HTTP 请求转发到本地的 8080 端口,并且把 $remote_addr$proxy_add_x_forwarded_for$host$http_host 加到请求头中,如果有一个 Node.js 服务正在监听 8080 端口,则可以接收到这些请求。

如果用户请求的是 mydomain.com/other/service/* 链接,则把 $remote_addr$proxy_add_x_forwarded_for$host$http_host 加到请求头中,转发到本机的 8081 端口。

静态文件服务器

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

location / {
root /my/assets/root;
autoindex off;
}

location /other/ {
alias /my/other/assets/root;
autoindex off;
}
}

当用户请求 assets.mydomain.com 首页时,则会返回 /my/assets/root路径中的内容,当访问 assets.mydomain.com/other 时,会返回 /my/other/assets/root 路径中的内容。并且都不会自动返回 index.html 文件,因为都禁止了 autoindex;

参考

Nginx 官方文档