Nginx :一台服务器部署多个网站
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 记录:
主机记录用于指定域名前缀:@ 表示主域名 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;
}
}按路径转发:同一个域名也可以使用 /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,地址栏会变化。
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.asiaLinux 宿主机上的 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 让浏览器跳转。
