要通过 Nginx 实现内网主机在公网访问,通常是利用 Nginx 作为反向代理,将公网请求转发到内网主机。以下是实现步骤:

🧭 场景说明

需要一台公网服务器(如云主机),或者办公内网主机且做了固定公网映射,然后安装并配置 Nginx。

⚙️ 公网服务器安装Nginx

  1. 安装 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.comhttps://host2.example.com确认浏览器显示安全锁 🔒,并且证书信息正确。

✅ 注意事项

  • 每个域名必须有独立的证书和私钥。
  • 如果你使用的是通配符证书(如 *.example.com),可以复用同一套证书。
  • 确保防火墙开放了 443 和 80 端口。
Copyright © https://yan-jian.com 2023 all right reserved更新时间: 2025-09-28 10:48:50

results matching ""

    No results matching ""