当我们在一台服务器上 启动多个服务时, 因为在 http 协议下默认端口是 80 端口, https 下默认是 443 端口,为了好记和美观我们 只能对外暴漏
这两个端口。

以 http 协议 为例
假设我 有个后台服务在 127.0.0.1:3000
这个服务里面有个接口 /aaa/bbb
如果你的 后台服务启动到 3000 端口
http://xxxx.com:3000/aaa/bbb 这样也是可以访问的但是,不好记也不美观.
访问时 希望
http://xxxx.com/api/aaa/bbb

http://api.xxxx.com/aaa/bbb
所以我们得 让 Nginx 启动到 80 端口上, 然后 Nginx 通过 /api 前缀 或 二级域名 来进行代理到 目标服务

nginx.conf 配置

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

...

http {

...

server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

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

...

# api 前缀代理 配置代码
# 将 /api/ 接口代理到 node 服务 127.0.0.1:3000/
# /api/ 回被 替换成 / 这样到 目标服务器时 path 中就没有 /api 了

location /api/ {
proxy_pass http://127.0.0.1:3000/;
}
...
}

...

# 二级域名代理 配置代码
# 将 api.kycloud.xyz 域名 代理到 后台接口服务 127.0.0.1:3000
server {
listen 80;
server_name api.ykcloud.xyz;

# 访问日志 访问这个域名的日志 都会被记录到 nginx 目录下的 logs/api.ykcloud.access.log 下
# 这里如果不指定单独的 log 文件, nginx 也会有一个总的(有请求进来) log文件 logs/access.log
# 所以 如果不想单独记录这里可以注释
# access_log logs/api.ykcloud.access.log;

location / {
proxy_pass http://127.0.0.1:3000;
# 其它代理配置
# proxy_redirect off;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

...
}

实际中这两种方式选择一种就可以了.
还想到一种 代理方式就是 通过 正则表达式 配置 非静态资源代理到 后端服务. 我比较喜欢通过 二级域名 进行代理,这个就先不研究了.
附: location 配置模式

示例

nginx配置前缀匹配https://steel-mill.lg.china-yongfeng.com/mill-2250/app路径下的所有资源反向代理到https://steel-mill.lg.china-yongfeng.com/aaaa/app

要使用 Nginx 配置前缀匹配,将 https://steel-mill.lg.china-yongfeng.com/mill-2250/app 路径下的所有资源反向代理到 https://steel-mill.lg.china-yongfeng.com/aaaa/app,可以按照以下步骤进行配置:

Nginx 配置示例

  1. 打开 Nginx 配置文件。通常是 /etc/nginx/nginx.conf/etc/nginx/sites-available/default

  2. 添加一个新的 server 块,或在现有的 server 块中添加以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80;
server_name steel-mill.lg.china-yongfeng.com;

location /mill-2250/app {
proxy_pass https://steel-mill.lg.china-yongfeng.com/aaaa/app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

# 如果目标服务器需要使用 HTTPS
proxy_ssl_server_name on;
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
proxy_ssl_ciphers HIGH:!aNULL:!MD5;
}
}

说明

  • listen 80;:监听 HTTP 端口 80。如果使用 HTTPS,改为 listen 443 ssl; 并配置 SSL 证书。
  • server_name steel-mill.lg.china-yongfeng.com;:匹配请求的服务器名称。
  • location /mill-2250/app { ... }:匹配以 /mill-2250/app 开头的所有路径。
  • proxy_pass https://steel-mill.lg.china-yongfeng.com/aaaa/app;:将匹配到的路径代理到新的路径。
  • proxy_set_header ...:设置 HTTP 请求头以便正确传递客户端信息。
  • proxy_ssl_*:配置 SSL 相关设置。如果目标服务器使用 HTTPS,这些设置可以确保代理连接的安全性。

HTTPS 配置

如果你的 Nginx 服务器使用 HTTPS,请确保配置 SSL 证书。添加如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
listen 443 ssl;
server_name steel-mill.lg.china-yongfeng.com;

ssl_certificate /path/to/your_certificate.crt;
ssl_certificate_key /path/to/your_certificate_key.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;

location /mill-2250/app {
proxy_pass https://steel-mill.lg.china-yongfeng.com/aaaa/app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_ssl_server_name on;
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
proxy_ssl_ciphers HIGH:!aNULL:!MD5;
}
}

测试配置

在配置完成后,使用以下命令测试 Nginx 配置文件的正确性:

1
sudo nginx -t

如果配置文件语法正确,重新加载 Nginx:

1
sudo systemctl reload nginx

结论

通过以上步骤,你可以成功配置 Nginx 将 https://steel-mill.lg.china-yongfeng.com/mill-2250/app 路径下的所有资源反向代理到 https://steel-mill.lg.china-yongfeng.com/aaaa/app。确保正确设置 SSL 证书及相关代理头信息以确保请求的安全性和正确性。