0
0
0

Nginx :一台服务器部署多个网站

2026-10-22
2026-10-22
文章摘要
|

DNS + Nginx 实战:一台服务器部署多个网站

本文以 lookstar.asia 为例,说明如何用一个公网 IP 部署多个网站。先使用 HTTP 演示,HTTPS 与证书配置放在下一篇。

一、DNS 与 Nginx 的分工

DNS 负责将域名解析为服务器 IP,Nginx 负责根据域名或路径将请求交给不同服务。

lookstar.asia      ─┐
blog.lookstar.asia ─┼─ DNS → 123.123.123.123 → Nginx(80 端口)
api.lookstar.asia  ─┘                       ├─ 主站:静态网页
                                           ├─ 博客:9090
                                           └─ API:8081

多个域名可以共用一台服务器和一个公网 IP。DNS 不负责选择 9090、8081 等应用端口,这由 Nginx 处理。

二、配置 DNS 解析

在 DNSPod 等域名解析服务商添加以下 A 记录:

记录类型

主机记录

记录值

A

@

123.123.123.123

A

blog

123.123.123.123

A

api

123.123.123.123

主机记录用于指定域名前缀:@ 表示主域名 lookstar.asia;blog 表示 blog.lookstar.asia;api 表示 api.lookstar.asia。

以上 IP 为示例,实际配置时替换为服务器公网 IP,并在安全组、防火墙中放行对外使用的 80 端口。

三、Nginx 配置与反向代理

假设主站是静态页面(/var/www/lookstar),博客运行在 9090,Java API 运行在 8081。下面配置适用于 Nginx 安装在宿主机,后端端口可通过宿主机访问的场景。

# 主站
server {
    listen 80;
    server_name lookstar.asia;
    root /var/www/lookstar;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

# 博客
server {
    listen 80;
    server_name blog.lookstar.asia;

    location / {
        proxy_pass http://127.0.0.1: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;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

# Java API
server {
    listen 80;
    server_name api.lookstar.asia;

    location / {
        proxy_pass http://127.0.0.1:8081;
        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;
    }
}

指令

作用

listen 80

接收 80 端口的 HTTP 请求

server_name

匹配请求域名,选择对应网站

location /

匹配请求路径

proxy_pass

将请求转发给后端服务

proxy_set_header

将原始域名、客户端地址等信息传给后端(真实 IP 需结合可信代理配置)

按路径转发:同一个域名也可以使用 /api/ 区分后端。例如在主站的 server 中增加:

location /api/ {
    proxy_pass http://127.0.0.1:8081;
}

这里没有给 proxy_pass 添加末尾 /,所以 /api/users 会原样转发为 /api/users;如果写成 proxy_pass http://127.0.0.1:8081/;,在这个简单的前缀匹配示例中,后端收到的路径通常变为 /users。

Docker 部署注意:如果 Nginx 和 Java 服务分别运行在同一个 Docker Compose 网络的两个容器里,Nginx 容器中的 127.0.0.1 只代表 Nginx 容器本身,不能用来访问 Java 容器。应改用 Compose 服务名,例如 Java 服务名为 app:

proxy_pass http://app:8081;

两容器须处于可互通的 Docker 网络;Java 服务监听 8081 且允许其他容器访问。通常不必向公网映射后端端口。

四、301 与 302 重定向

反向代理是在服务器内部转发请求,浏览器地址一般不变;重定向是通知浏览器访问另一个 URL,地址栏会变化。

状态码

含义

用途

301

永久重定向

网站长期迁移

302

临时重定向

临时跳转、测试

Nginx 示例:

server {
    listen 80;
    server_name old.lookstar.asia;
    return 302 https://lookstar.asia$request_uri;
}

此时访问 http://old.lookstar.asia/a 会跳转到 https://lookstar.asia/a。CNAME 是 DNS 别名,不是 301/302 网页跳转。 如果旧域名采用 HTTPS,还需要为旧域名配置有效证书,才能正常完成 HTTPS 跳转。

五、常用命令与注意事项

Windows 10(PowerShell):

# 检查域名解析得到的 IP
nslookup blog.lookstar.asia

# 查看 HTTP 状态码和响应头
curl.exe -I http://blog.lookstar.asia

Linux 宿主机上的 Nginx:

nginx -t          # 检查配置语法
nginx -s reload   # 重新加载配置

Nginx 运行在名为 nginx 的 Docker 容器中:

docker exec nginx nginx -t
docker exec nginx nginx -s reload

常见问题:

  • 域名能解析但网页打不开:继续检查 80 端口、安全组、防火墙、Nginx 和后端服务。DNS 正常不代表 HTTP 正常。

  • 不同域名打开同一个网站:检查 server_name,避免落入默认站点。

  • 出现 502 Bad Gateway:检查 proxy_pass、后端是否启动,以及容器之间能否通信。

  • 接口出现 404:确认 /api/ 路径前缀是否按预期保留或删除。

核心关系:DNS 找到服务器,Nginx 选择服务,proxy_pass 转发请求,301/302 让浏览器跳转。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!

评论