Nginx中虚拟主机的三种配置方式详解
作者:知远漫谈
在现代 Web 架构中,单一服务器承载多个网站已成为常态。无论是小型创业公司还是大型企业,都希望在有限的硬件资源下最大化服务效率。Nginx 作为高性能、轻量级的反向代理与 Web 服务器,凭借其出色的并发处理能力与灵活的虚拟主机配置机制,成为众多开发者的首选。本文将深入探讨如何通过 Nginx 实现基于域名、端口、IP 地址的多站点部署,覆盖从基础配置到高阶实战的完整路径,并结合 Java 应用场景提供可运行的示例代码,帮助你构建一个稳定、可扩展、安全的多站点服务架构。

什么是虚拟主机(Virtual Host)?
虚拟主机(Virtual Host)是 Web 服务器通过单一 IP 地址或端口,为多个不同域名或站点提供服务的技术。它允许你在一台服务器上运行多个网站,每个网站拥有独立的根目录、配置文件、SSL 证书和访问日志,对用户而言,就像各自运行在独立的物理服务器上一样。
Nginx 的虚拟主机机制基于 server 块定义,每个 server 块代表一个独立的站点。Nginx 通过解析客户端请求中的 Host 头、目标端口和绑定 IP 地址,匹配最合适的 server 块进行响应。
小知识:Apache 也有类似机制,称为“Name-based Virtual Hosts”,但 Nginx 在高并发场景下的内存占用与响应速度更具优势,尤其适合现代微服务架构。
Nginx 配置文件结构概览
在开始配置之前,我们先了解 Nginx 的核心配置文件结构。通常,Nginx 的主配置文件位于:
- Linux 系统:
/etc/nginx/nginx.conf - macOS (Homebrew):
/usr/local/etc/nginx/nginx.conf - Windows:
C:\nginx\conf\nginx.conf
主配置文件中,通常包含以下关键部分:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
关键点:include /etc/nginx/conf.d/*.conf; 表示 Nginx 会加载 conf.d 目录下所有 .conf 文件,这是推荐的多站点管理方式,便于模块化与版本控制。
我们将在 conf.d 目录下为每个站点创建独立的配置文件,如:
site1.example.com.confapi.example.com:8080.confapp1.192.168.1.10.conf
基于域名的虚拟主机(Name-based Virtual Host)
这是最常见的虚拟主机类型。多个域名共享同一个 IP 地址和端口(通常是 80 或 443),Nginx 通过 Host 请求头区分请求属于哪个站点。
场景说明
假设你有一台服务器,IP 为 192.168.1.10,你想部署三个网站:
www.example.com—— 公司官网blog.example.com—— 博客系统shop.example.com—— 电商前端
它们都监听 80 端口,但内容完全不同。
配置文件示例
在 /etc/nginx/conf.d/ 下创建三个文件:
1.www.example.com.conf
server {
listen 80;
server_name www.example.com example.com;
root /var/www/www.example.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/www.example.com.access.log;
error_log /var/log/nginx/www.example.com.error.log;
}
2.blog.example.com.conf
server {
listen 80;
server_name blog.example.com;
root /var/www/blog.example.com/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
access_log /var/log/nginx/blog.example.com.access.log;
error_log /var/log/nginx/blog.example.com.error.log;
}
3.shop.example.com.conf
server {
listen 80;
server_name shop.example.com;
root /var/www/shop.example.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
access_log /var/log/nginx/shop.example.com.access.log;
error_log /var/log/nginx/shop.example.com.error.log;
}
Java 应用集成示例
虽然 Nginx 本身是静态服务器,但常作为 Java Web 应用(如 Spring Boot)的反向代理。我们来模拟一个场景:
你有一个 Spring Boot 应用,运行在 localhost:8081,希望通过 api.example.com 访问。
Java 代码:Spring Boot REST API
package com.example.apiserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@SpringBootApplication
@RestController
public class ApiServerApplication {
public static void main(String[] args) {
SpringApplication.run(ApiServerApplication.class, args);
}
@GetMapping("/health")
public Map<String, Object> healthCheck() {
Map<String, Object> response = new HashMap<>();
response.put("status", "UP");
response.put("service", "API Server v1.2");
response.put("timestamp", System.currentTimeMillis());
response.put("message", "✅ Nginx + Java integration working!");
return response;
}
@GetMapping("/user/{id}")
public Map<String, Object> getUser(@PathVariable("id") Long id) {
Map<String, Object> user = new HashMap<>();
user.put("id", id);
user.put("name", "张三");
user.put("email", "zhangsan@example.com");
user.put("role", "admin");
return user;
}
}Nginx 配置:反向代理到 Java 应用
在 /etc/nginx/conf.d/api.example.com.conf 中:
server {
listen 80;
server_name api.example.com;
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;
# 超时设置
proxy_connect_timeout 5s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
access_log /var/log/nginx/api.example.com.access.log;
error_log /var/log/nginx/api.example.com.error.log;
}
重启 Nginx 后,访问 http://api.example.com/health 将返回 Java 应用的 JSON 响应。
DNS 与本地测试
为了在本地测试,你需要修改 /etc/hosts(Linux/macOS)或 C:\Windows\System32\drivers\etc\hosts(Windows):
192.168.1.10 www.example.com 192.168.1.10 blog.example.com 192.168.1.10 shop.example.com 192.168.1.10 api.example.com
然后在浏览器中访问:
http://www.example.comhttp://blog.example.comhttp://shop.example.comhttp://api.example.com/health
提示:若你使用 Docker,可将 Java 应用部署在容器中,Nginx 通过 proxy_pass http://app-container:8081; 进行代理,实现真正的隔离部署。
基于端口的虚拟主机(Port-based Virtual Host)
当多个站点需要共享同一个域名,但提供不同服务时,端口绑定成为理想方案。例如:
example.com:80→ 网站首页example.com:8080→ 管理后台example.com:9000→ API 网关
这种配置常用于内部系统、测试环境或微服务架构中。
场景说明
假设你有一个主站 example.com,同时部署了:
- 管理后台(运行在 8080)
- Swagger 文档接口(运行在 9000)
- 前端静态资源(运行在 80)
配置文件示例
1. 主站(端口 80)
server {
listen 80;
server_name example.com;
root /var/www/example.com/main;
index index.html;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/example.com-main.access.log;
error_log /var/log/nginx/example.com-main.error.log;
}
2. 管理后台(端口 8080)
server {
listen 8080;
server_name example.com;
root /var/www/example.com/admin;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# 限制访问来源(仅允许内网)
allow 192.168.1.0/24;
deny all;
access_log /var/log/nginx/example.com-admin.access.log;
error_log /var/log/nginx/example.com-admin.error.log;
}
3. Swagger API 文档(端口 9000)
server {
listen 9000;
server_name example.com;
root /var/www/example.com/swagger;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# 允许跨域访问(前端调用)
add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
add_header Access-Control-Allow-Headers "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization";
access_log /var/log/nginx/example.com-swagger.access.log;
error_log /var/log/nginx/example.com-swagger.error.log;
}
Java 应用:部署 Swagger UI
如果你使用 Spring Boot,只需引入依赖:
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.3.0</version>
</dependency>然后启动应用,监听 8081 端口:
@SpringBootApplication
public class SwaggerApp {
public static void main(String[] args) {
System.setProperty("server.port", "8081");
SpringApplication.run(SwaggerApp.class, args);
}
}
Nginx 反向代理配置:
server {
listen 9000;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8081/v3/api-docs;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /swagger-ui/ {
proxy_pass http://127.0.0.1:8081/swagger-ui/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
access_log /var/log/nginx/example.com-swagger.access.log;
error_log /var/log/nginx/example.com-swagger.error.log;
}
注意事项
- 端口必须在防火墙中开放(如
ufw allow 8080) - 浏览器地址栏会显示端口号,不够“优雅”
- 适合内网或测试环境,生产环境建议使用域名 + SSL + 80/443
- 多端口部署会增加运维复杂度,建议配合 Docker Compose 管理
基于 IP 的虚拟主机(IP-based Virtual Host)
当多个站点使用相同域名和端口,但需要绑定不同 IP 地址时,使用 IP-based 虚拟主机。这在以下场景非常有用:
- 服务器拥有多个公网 IP
- 某些站点需要独立 SSL 证书(旧版客户端不支持 SNI)
- 安全隔离需求(如金融系统 vs 公共网站)
场景说明
你有两块网卡,或通过 VLAN 分配了两个 IP:
192.168.1.10→ 对外官网192.168.1.11→ 内部管理后台(不对外暴露)
两个站点都使用 example.com,但通过不同 IP 访问。
配置文件示例
1. 外网官网(IP: 192.168.1.10)
server {
listen 192.168.1.10:80;
server_name example.com;
root /var/www/public-site;
index index.html;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/public-site.access.log;
error_log /var/log/nginx/public-site.error.log;
}
2. 内部后台(IP: 192.168.1.11)
server {
listen 192.168.1.11:80;
server_name example.com;
root /var/www/internal-admin;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# 仅允许内网访问
allow 192.168.1.0/24;
deny all;
access_log /var/log/nginx/internal-admin.access.log;
error_log /var/log/nginx/internal-admin.error.log;
}
如何测试
在客户端机器上,分别访问:
http://192.168.1.10→ 显示官网http://192.168.1.11→ 显示后台
若你在浏览器中访问 http://example.com,Nginx 会匹配 server_name example.com,但不会区分 IP,除非你显式绑定 IP。
安全建议
- 使用
listen 192.168.1.11:80可避免外部直接访问内部服务 - 结合防火墙规则(如 iptables)进一步加固
- 对敏感后台启用 Basic Auth:
location / {
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd;
try_files $uri $uri/ =404;
}
生成密码文件:
sudo apt install apache2-utils htpasswd -c /etc/nginx/.htpasswd admin
多种方式组合:高级虚拟主机策略
现实世界中,很少只使用单一方式。优秀的架构往往是域名 + 端口 + IP的组合策略。
案例:企业级多租户系统
你是一家 SaaS 平台提供商,为多个客户(客户A、客户B)提供独立子域名服务,同时:
- 客户A 使用
customerA.yourcompany.com - 客户B 使用
customerB.yourcompany.com - 所有客户后台通过
admin.yourcompany.com:8081访问 - 你有两台服务器:
192.168.1.10(对外)、192.168.1.11(数据库/缓存)
架构如下:
| 服务类型 | 域名 | 端口 | IP | 说明 |
|---|---|---|---|---|
| 客户前端 | customerA.yourcompany.com | 80 | 192.168.1.10 | 静态 HTML + JS |
| 客户前端 | customerB.yourcompany.com | 80 | 192.168.1.10 | 静态 HTML + JS |
| 管理后台 | admin.yourcompany.com | 8081 | 192.168.1.10 | Java Spring Boot |
| 内部服务 | internal.yourcompany.com | 80 | 192.168.1.11 | 仅限内网访问 |
Nginx 配置文件集合
customerA.yourcompany.com.conf
server {
listen 80;
server_name customerA.yourcompany.com;
root /var/www/customers/customerA;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# 缓存静态资源
location ~* \.(css|js|png|jpg|jpeg|gif|ico)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
access_log /var/log/nginx/customerA.access.log;
error_log /var/log/nginx/customerA.error.log;
}
customerB.yourcompany.com.conf
server {
listen 80;
server_name customerB.yourcompany.com;
root /var/www/customers/customerB;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# 自定义响应头(用于客户品牌识别)
add_header X-Customer-ID "B-2024";
access_log /var/log/nginx/customerB.access.log;
error_log /var/log/nginx/customerB.error.log;
}
admin.yourcompany.com.conf
server {
listen 8081;
server_name admin.yourcompany.com;
location / {
proxy_pass http://127.0.0.1:8082;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 限制仅公司内网访问
allow 192.168.1.0/24;
allow 10.0.0.0/8;
deny all;
access_log /var/log/nginx/admin.access.log;
error_log /var/log/nginx/admin.error.log;
}
internal.yourcompany.com.conf
server {
listen 192.168.1.11:80;
server_name internal.yourcompany.com;
root /var/www/internal;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# 禁止外部访问
deny all;
access_log /var/log/nginx/internal.access.log;
error_log /var/log/nginx/internal.error.log;
}
Mermaid 架构图:多租户系统拓扑

此图清晰展示了流量如何根据域名、端口、IP 被路由到不同后端服务。在实际运维中,这种拓扑结构能极大提升系统弹性与安全性。
SSL/TLS 加密:HTTPS 虚拟主机配置
安全是现代 Web 的基石。为每个虚拟主机配置 HTTPS,不仅能保护用户数据,还能提升 SEO 排名。
使用 Let’s Encrypt 免费证书
我们使用 certbot 自动申请证书(以 Ubuntu 22.04 为例):
sudo apt update sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d www.example.com -d blog.example.com -d shop.example.com
Certbot 会自动修改 Nginx 配置,添加 SSL 监听与证书路径。
生成的 HTTPS 配置示例
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
ssl_prefer_server_ciphers off;
root /var/www/www.example.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/www.example.com.ssl.access.log;
error_log /var/log/nginx/www.example.com.ssl.error.log;
}
# 强制 HTTP 跳转 HTTPS
server {
listen 80;
server_name www.example.com;
return 301 https://$host$request_uri;
}
Java 应用 HTTPS 集成
如果你的 Java 应用也启用 HTTPS(如 Spring Boot),你需要:
生成 keystore:
keytool -genkey -alias tomcat -keyalg RSA -keystore keystore.jks
在 application.properties 中配置:
server.port=8443 server.ssl.key-store=classpath:keystore.jks server.ssl.key-store-password=changeit server.ssl.key-password=changeit server.ssl.key-store-type=JKS
Nginx 反向代理:
server {
listen 443 ssl;
server_name api.example.com;
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
location / {
proxy_pass https://127.0.0.1:8443;
proxy_ssl_verify off; # 仅在自签名证书时使用,生产环境请开启
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
重要提示:生产环境请关闭 proxy_ssl_verify off,并配置 proxy_ssl_trusted_certificate 指向 CA 证书链。
性能优化与最佳实践
1.启用 Gzip 压缩
gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
2.缓存静态资源
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
3.限制请求速率(防刷)
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
server {
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass http://backend;
}
}
4.启用 HTTP/2
listen 443 ssl http2;
HTTP/2 支持多路复用,显著提升页面加载速度,尤其适合多资源站点。
5.日志分离与轮转
为每个站点配置独立日志,便于排查问题:
# 编辑 /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
Java + Nginx + Docker 实战演练
我们构建一个完整的多站点 Docker 环境,包含:
- Nginx(反向代理)
- Spring Boot API(Java)
- 静态网站(HTML)
- Redis 缓存
项目结构
nginx-multi-site/
├── nginx/
│ ├── nginx.conf
│ └── sites-available/
│ ├── frontend.conf
│ └── api.conf
├── java-api/
│ ├── src/
│ │ └── main/java/com/example/ApiApplication.java
│ └── Dockerfile
├── frontend/
│ ├── index.html
│ └── Dockerfile
└── docker-compose.yml
docker-compose.yml
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/sites-available:/etc/nginx/conf.d
- ./frontend:/var/www/frontend
depends_on:
- java-api
restart: unless-stopped
java-api:
build: ./java-api
ports:
- "8081:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
restart: unless-stopped
frontend:
build: ./frontend
ports:
- "8082:80"
restart: unless-stoppedjava-api/Dockerfile
FROM openjdk:17-jre-slim WORKDIR /app COPY target/api-1.0.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","app.jar"]
frontend/Dockerfile
FROM nginx:alpine COPY index.html /usr/share/nginx/html/index.html COPY index.html /usr/share/nginx/html/404.html EXPOSE 80
frontend/index.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>前端站点</title>
</head>
<body>
<h1>🎉 欢迎访问前端站点</h1>
<p>调用 API:<a href="http://localhost/api/health" rel="external nofollow" >/api/health</a></p>
<script>
fetch('http://nginx/api/health')
.then(r => r.json())
.then(data => console.log('API 响应:', data))
.catch(e => console.error('调用失败:', e));
</script>
</body>
</html>nginx/sites-available/frontend.conf
server {
listen 80;
server_name frontend.example.com;
root /var/www/frontend;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
nginx/sites-available/api.conf
server {
listen 80;
server_name api.example.com;
location /api/ {
proxy_pass http://java-api:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
启动服务
cd nginx-multi-site docker-compose up --build
访问:
http://localhost→ 前端页面http://localhost/api/health→ Java API 响应- 修改
/etc/hosts,绑定127.0.0.1 frontend.example.com api.example.com,即可用域名访问
这是一个完整可运行的多站点架构,支持未来扩展:添加数据库、缓存、负载均衡器等。
常见错误与调试技巧
| 问题 | 原因 | 解决方案 |
|---|---|---|
404 Not Found | root 路径错误或文件不存在 | 使用 ls -la /var/www/site 检查文件是否存在 |
502 Bad Gateway | Java 应用未启动或端口错误 | curl http://localhost:8081/health 测试后端 |
SSL_ERROR_BAD_CERT_DOMAIN | 证书域名不匹配 | 使用 openssl x509 -in cert.pem -text -noout 查看证书域名 |
nginx: [emerg] bind() to 0.0.0.0:80 failed | 端口被占用 | sudo lsof -i :80,sudo kill -9 <PID> |
server_name 不生效 | 缺少 listen 或域名拼写错误 | 检查大小写、是否包含 www、是否用通配符 *.example.com |
调试命令
# 检查配置语法 sudo nginx -t # 重载配置(不中断服务) sudo nginx -s reload # 查看正在监听的端口 sudo ss -tuln | grep nginx # 查看访问日志实时流 tail -f /var/log/nginx/www.example.com.access.log # 模拟请求测试 curl -H "Host: blog.example.com" http://192.168.1.10
监控与自动化
使用 Prometheus + Grafana 监控 Nginx
在 Nginx 中启用 stub_status:
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
然后使用 nginx-prometheus-exporter 导出指标:
# docker-compose.yml 添加
nginx-exporter:
image: nginx/nginx-prometheus-exporter:0.10.0
ports:
- "9113:9113"
command: -nginx.scrape-uri=http://nginx/nginx_status
depends_on:
- nginx
在 Grafana 中导入 Nginx Dashboard 即可可视化 QPS、连接数、响应时间。
与其他技术的对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Nginx 虚拟主机 | 高性能、低内存、配置灵活 | 无内置负载均衡(需 upstream) | 多站点、静态资源、反向代理 |
| Apache VirtualHost | 模块丰富、.htaccess 支持 | 内存占用高、线程模型效率低 | 传统 PHP 网站、共享主机 |
| Traefik | 自动发现、Docker 集成好 | 配置复杂、学习曲线陡峭 | 微服务、Kubernetes |
| HAProxy | 专业负载均衡、TCP/HTTP 代理 | 无静态文件服务能力 | 高并发 API 网关、TCP 转发 |
推荐:中小型项目用 Nginx,大型微服务用 Traefik + Nginx 组合。
未来趋势:云原生与 Nginx Ingress
随着 Kubernetes 的普及,Nginx Ingress Controller 成为标准组件。它本质上是 Nginx 的 Kubernetes 插件,支持:
- 自动域名绑定(Ingress Rule)
- 自动 TLS 证书(Cert-Manager)
- 金丝雀发布、灰度发布
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: multi-site-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: frontend.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080未来你将不再手动写 Nginx 配置,而是通过 YAML 定义路由策略,实现“声明式运维”。
总结:构建你的多站点架构蓝图
| 维度 | 推荐实践 |
|---|---|
| 域名 | 使用 server_name 匹配,支持通配符 *.example.com |
| 端口 | 生产环境尽量使用 80/443,内部服务可开放 8080/9000 |
| IP | 用于安全隔离,如内网管理后台 |
| Java 集成 | Nginx 反向代理 Spring Boot,避免暴露端口 |
| HTTPS | 强制使用 Let’s Encrypt,开启 HSTS |
| 性能 | 启用 Gzip、缓存、HTTP/2、限制速率 |
| 监控 | 日志分离 + Prometheus + Grafana |
| 自动化 | 使用 Docker + docker-compose 管理多服务 |
| 扩展性 | 未来迁移到 Kubernetes + Ingress |
结语:架构之美在于简单与可扩展
Nginx 的虚拟主机配置看似简单,实则蕴含了网络架构的精髓:分而治之,按需路由。无论是为个人博客搭建独立站点,还是为企业构建千级租户的 SaaS 平台,这套机制始终稳定可靠。
当你在深夜调试一个 502 错误时,当你看到 curl -I 返回 200 OK 时,当你在 Grafana 图表上看到 QPS 稳定上升时——你会明白,这不仅是配置文件,更是你亲手搭建的数字世界基石。
以上就是Nginx中虚拟主机的三种配置方式详解的详细内容,更多关于Nginx虚拟主机配置的资料请关注脚本之家其它相关文章!
