Nginx 管理&端口转发权限配置

Nginx 是一款高性能 Web 服务器和反向代理工具,非常适合搭建多实例服务,统一管理外部访问端口与权限。本文记录完整的安装、配置 SSL/Basic Auth、实例化端口转发以及日志调试全流程,希望对需要集中运维或微服务网关的同学有所助益。


一、安装 Nginx 及相关工具

1
2
sudo apt update
sudo apt install nginx

安装 SSL 证书工具(Certbot)和生成自签名证书

1
2
3
4
5
6
7
8
9
sudo apt install certbot python3-certbot-nginx
sudo mkdir -p /etc/nginx/ssl

# 自签名证书生成示例
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/10.10.90.60.key \
-out /etc/nginx/ssl/10.10.90.60.crt \
-subj "/CN=10.10.90.60" \
-addext "subjectAltName=IP:10.10.90.60"

二、HTTPS 加密 & Basic Auth 安全认证

Nginx 支持灵活的 SSL 配置和基础 HTTP 认证,有效隔离未授权访问,实现 IP/端口级控制。

生成 HTTP Basic Auth 账户密码文件

1
2
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd admin

在 server 段落中插入如下配置开启认证及证书(重点摘录):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 443 ssl;
server_name 10.10.90.39;

# SSL(自签名示例)
ssl_certificate /etc/nginx/ssl/10.10.90.39.crt;
ssl_certificate_key /etc/nginx/ssl/10.10.90.39.key;
ssl_protocols TLSv1.2 TLSv1.3;

# HTTP 基本认证
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd;

# ... 省略其他 location...
}

三、实例化多端口、多实例的灵活转发策略

传统的固定端口方式效率较低,通过 Nginx 的map、正则和变量,可轻松实现一套入口根据不同路径/标志符转发至后端不同机器或容器的指定端口。

支持 WebSocket 透传,以及复杂 URL 重写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
http {
# ... 省略常规配置。..

# 实例名到后端地址映射(后续可拓展为环节热更新)
map $instance_name $backend {
comfy1 10.10.90.49:8188;
comfy2 10.10.90.25:8188;
# ...
comfytest1 10.10.90.49:8188;
}

# 提取 WebSocket 请求,用于单独存日志以及升级代理
map $http_upgrade $is_websocket {
default 0;
"websocket" 1;
}

log_format websocket '$remote_addr - $http_upgrade [$time_local] "$host" "$request"';
}

动态分流 Location(正则+变量+proxy_pass)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
listen 443 ssl;
# ...ssl/basic auth 见上文。..

# /comfy1/path, /comfy2/path 自动甄别分流
location ~ ^/(?<instance_name>comfy\d+)(?:/?)(?<route_path>/.*)$ {
set $proxy_full_url "http://$backend$route_path$is_args$args";

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";

access_log /var/log/nginx/websocket.log websocket if=$is_websocket;

proxy_pass http://$backend$route_path$is_args$args;

# 上游信息写入日志便于追溯
access_log /var/log/nginx/debug_access.log debug_fmt;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

TIP:
proxy_pass结合 map 和正则变量,实现了【多实例切换】【WebSocket 直通】【只暴露一个 443 端口】的多功能入口。日志格式自定义便于调试追踪。


四、调试建议与配置管理经验

热加载生效 & 配置测试

1
2
sudo nginx -t      # 测试语法
sudo nginx -s reload

管理站点可用性

保持配置结构简单易控,对 site 独立成 conf 文件,并软链管理:

1
2
sudo ln -s /etc/nginx/sites-available/ip-proxy.conf \
/etc/nginx/sites-enabled/ip-proxy.conf

日志调优

对不同场景分别制定格式,尤其是 debug 和 websocket,避免统一日志难以溯源。

1
log_format debug_fmt '[$time_local] Instance:"$instance_name"|Backend:"$backend"|Route:"$route_path"|Client:$remote_addr->$request|Status:$status|ProxyPass:"$proxy_full_url"|';

五、自我思考与扩展建议

  • 安全优先: 强烈建议上线时更换自签名为 Let’s Encrypt 或企业可信 CA, 并根据实际关闭低安全协议。
  • 变量式映射更灵活: 每新增实例无需改动回填上游映射即可,方便批量批次发布。
  • WebSocket 兼容: 长连接应用与数据推送均可支持。
  • 日志精准: 滚动分类型存储便于排查。
  • 定期复审配置与密钥,避免泄露风险

本文为实战向总结,着力兼顾易用性、安全性和可扩展性。如有更优实践,欢迎留言讨论。

作者

zion h4

发布于

2025-04-30

更新于

2025-04-30

许可协议

评论