在云服务器资源宝贵的今天,我们往往希望在一个公网ip的一台服务器上运行多个项目。比如:
www.a.com指向个人博客。www.b.com指向api反代。
Nginx 作为高性能的 HTTP 和反向代理服务器,通过 “虚拟主机(Virtual Host)” 功能,可以轻松实现根据访问的域名将请求转发到不同的目录或后端服务。
核心原理
当我们在浏览器输入域名并回车时,请求最终都会到达服务器的 80(HTTP)或 443(HTTPS)端口。Nginx 能够区分不同站点的秘密在于 HTTP 请求头中的 Host 字段。Nginx 接收到请求后,会将其中的域名与配置文件中 server_name 指令进行匹配,匹配成功后,就进入对应的 server 块进行处理。
在/etc/nginx/conf.d/ 目录下为每个站点创建独立的配置文件。
准备工作
- 域名解析:确保你的多个域名(如
a.com和b.com)都已通过 A 记录解析到同一台服务器的 IP 地址。 - 环境安装:服务器已安装 Nginx。
- 站点准备:准备好不同站点的代码目录。
- 站点 A 路径:
/var/www/site_a - 站点 B 路径:
/var/www/site_b
- 站点 A 路径:
具体配置步骤
1. 配置站点 A
创建文件 /etc/nginx/conf.d/site_a.conf:
server {
listen 80;
server_name a.com www.a.com; # 这里填写你的域名
root /var/www/site_a; # 站点代码存放路径
index index.html index.htm index.php;
location / {
try_files $uri $uri/ =404;
}
# 如果是 PHP 站点,取消下面注释
# location ~ \.php$ {
# include snippets/fastcgi-php.conf;
# fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
# }
}
2. 配置站点 B
创建文件 /etc/nginx/conf.d/site_b.conf:
server {
listen 80;
server_name b.com www.b.com; # 这里填写第二个域名
root /var/www/site_b;
index index.html index.htm;
location / {
# 如果站点B是一个运行在 3000 端口的 Node.js 程序,可以使用反向代理
# proxy_pass http://localhost:3000;
try_files $uri $uri/ =404;
}
}
这里其实配置文件中也可以加入cert证书,来实现443端口,https连接。
验证并生效
先进行语法检查:sudo nginx -t
如果看到 syntax is ok 和 test is successful,则说明配置无误。接着重新加载 Nginx 配置:sudo systemctl reload nginx
# 或者
sudo nginx -s reload
如果所有 server_name 都不匹配,Nginx 会默认转发给第一个加载的配置文件。建议设置一个默认服务器(default_server)来处理未匹配域名。
通过 Nginx 的虚拟主机配置,我们可以极大地提高服务器的利用率。无论是静态 HTML 页面、PHP 网站,还是通过反向代理对接 Java/Node.js 服务,配置逻辑都是一致的。