要通过 Nginx 实现内网主机在公网访问,通常是利用 Nginx 作为反向代理,将公网请求转发到内网主机。以下是实现步骤:
🧭 场景说明
需要一台公网服务器(如云主机),或者办公内网主机且做了固定公网映射,然后安装并配置 Nginx。
⚙️ 公网服务器安装Nginx
安装 Nginx
sudo apt update sudo apt install nginx
🧭 场景假设
Nginx 配置示例,展示如何为多个主机或多个域名启用 HTTPS,并分别代理到不同的内网主机服务。假设已经从公有云平台(如阿里云、腾讯云)获取了 SSL 证书,并将它们上传到服务器。
域名 | 内网主机 IP | 内网端口 | 证书路径 |
---|---|---|---|
host1.example.com |
192.168.1.101 |
8080 |
/etc/nginx/ssl/host1/ |
host2.example.com |
192.168.1.102 |
9090 |
/etc/nginx/ssl/host2/ |
⚙️ Nginx 多域名 HTTPS 配置示例
🗂️ 推荐目录结构
/etc/nginx/
├── nginx.conf # 主配置文件
├── sites-available/ # 虚拟主机配置文件(自己创建)
│ ├── host1.example.com.conf
│ └── host2.example.com.conf
├── sites-enabled/ # 启用的配置(软链接)
│ ├── host1.example.com.conf -> ../sites-available/host1.example.com.conf
│ └── host2.example.com.conf -> ../sites-available/host2.example.com.conf
├── ssl/ # SSL 证书目录(自己创建)
│ ├── host1.example.com/
│ │ ├── certificate.pem
│ │ ├── private.key
│ │ └── ca_bundle.pem
│ └── host2.example.com/
│ ├── certificate.pem
│ ├── private.key
│ └── ca_bundle.pem
将每个域名的配置文件放在 /etc/nginx/sites-available/
目录下,例如:
/etc/nginx/sites-available/
├── host1.example.com.conf
├── host2.example.com.conf
然后通过软链接启用它们:
sudo ln -s /etc/nginx/sites-available/host1.example.com.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/host2.example.com.conf /etc/nginx/sites-enabled/
📄 主配置文件 /etc/nginx/nginx.conf
这个文件通常包含如下内容:
http {
include /etc/nginx/sites-enabled/*;
...
}
确保它包含了 sites-enabled
目录,否则你需要手动引入你的配置文件。
🔐 证书文件存放建议
你可以将 SSL 证书和私钥放在 /etc/nginx/ssl/
下,按域名分目录:
/etc/nginx/ssl/
├── host1.example.com/
│ ├── certificate.pem
│ ├── private.key
│ └── ca_bundle.pem
├── host2.example.com/
│ ├── certificate.pem
│ ├── private.key
│ └── ca_bundle.pem
虚拟主机配置文件 /etc/nginx/sites-available/host1.example.com.conf
# Host 1 配置
server {
listen 443 ssl;
server_name host1.example.com;
ssl_certificate /etc/nginx/ssl/host1.example.com/certificate.pem;
ssl_certificate_key /etc/nginx/ssl/host1.example.com/private.key;
ssl_trusted_certificate /etc/nginx/ssl/host1.example.com/ca_bundle.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://192.168.1.101:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# HTTP 自动跳转到 HTTPS(可选)
server {
listen 80;
server_name host1.example.com;
return 301 https://$host$request_uri;
}
虚拟主机配置文件 /etc/nginx/sites-available/host2.example.com.conf
# Host 2 配置
server {
listen 443 ssl;
server_name host2.example.com;
ssl_certificate /etc/nginx/ssl/host2.example.com/certificate.pem;
ssl_certificate_key /etc/nginx/ssl/host2.example.com/private.key;
ssl_trusted_certificate /etc/nginx/ssl/host2.example.com/ca_bundle.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://192.168.1.102:9090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# HTTP 自动跳转到 HTTPS(可选)
server {
listen 80;
server_name host2.example.com;
return 301 https://$host$request_uri;
}
✅ 重启 Nginx
sudo nginx -t # 检查配置是否正确
sudo systemctl reload nginx
验证 HTTPS 是否生效
访问 https://host1.example.com
,https://host2.example.com
确认浏览器显示安全锁 🔒,并且证书信息正确。
✅ 注意事项
- 每个域名必须有独立的证书和私钥。
- 如果你使用的是通配符证书(如
*.example.com
),可以复用同一套证书。 - 确保防火墙开放了 443 和 80 端口。