在 Linux 服务器或 VPS 上配置 Nginx 虚拟主机(Virtual Host)是托管多个网站或应用的基础。本文将从基础配置开始,逐步介绍如何添加虚拟主机、支持 PHP、设置图片防盗链以及配置 WordPress 伪静态规则。
准备工作
本文假设您的 Nginx 服务器已安装完毕。如果您尚未安装,可参考各 Linux 发行版的官方文档,或使用 LNMP 一键安装包(如 lnmp.org)快速部署环境。
增加 Nginx 虚拟主机
配置虚拟主机的主要步骤如下:
- 创建配置文件:进入 Nginx 配置目录(通常为
/usr/local/nginx/conf/vhost或/etc/nginx/conf.d),创建一个以域名命名的配置文件,例如demo.example.com.conf。 - 编写服务器块配置:在配置文件中添加一个
server块,定义监听端口、域名、网站根目录等核心参数。 - 引入配置文件:在主配置文件
nginx.conf的http块中,使用include指令引入虚拟主机配置文件。 - 重启 Nginx:应用配置更改。
以下是一个基础的虚拟主机配置示例:
server {
listen 80;
server_name demo.example.com;
index index.html index.htm index.php;
root /var/www/demo_example_com;
access_log /var/log/nginx/demo.example.com.access.log;
error_log /var/log/nginx/demo.example.com.error.log;
}
在主配置文件 nginx.conf 的 http 块中添加:
include /usr/local/nginx/conf/vhost/*.conf;
配置完成后,执行以下命令重启 Nginx:
# 使用 systemd 的系统
sudo systemctl restart nginx
# 或使用 service 命令
sudo service nginx restart
让 Nginx 虚拟主机支持 PHP
要使虚拟主机能够运行 PHP 程序(如 WordPress),需要在 server 块中添加一个处理 PHP 文件的 location 块,通常通过 PHP-FPM(FastCGI 进程管理器)实现。
修改后的配置示例如下:
server {
listen 80;
server_name demo.example.com;
index index.html index.htm index.php;
root /var/www/demo_example_com;
location ~ .php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock; # 请根据实际 PHP 版本和 Socket 路径修改
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
access_log /var/log/nginx/demo.example.com.access.log;
error_log /var/log/nginx/demo.example.com.error.log;
}
重要说明:fastcgi_pass 的值需根据您的 PHP-FPM 配置进行调整。现代 Linux 发行版通常使用类似 /run/php/php版本-fpm.sock 的 Socket 路径。
图片防盗链配置
为了防止其他网站直接引用(盗链)您服务器上的图片,消耗您的带宽,可以通过检查 HTTP 请求头中的 Referer 字段来实现防盗链。
在 server 块中添加以下配置:
location ~ .(ico|jpg|jpeg|png|gif|webp)$ {
expires 1y; # 设置浏览器缓存 1 年
add_header Cache-Control "public, immutable";
# 定义合法的来源(Referer)
valid_referers none blocked demo.example.com *.google.com *.baidu.com;
# 如果来源不合法,则返回 403 或 404
if ($invalid_referer) {
return 403;
# 或者 return 404;
}
}
说明:valid_referers 指令定义了允许访问图片的域名。none 表示请求头中没有 Referer(如直接浏览器访问),blocked 表示 Referer 存在但被防火墙或代理移除。您可以根据需要添加自己的域名或允许的第三方站点。
WordPress 伪静态配置
WordPress 启用“固定链接”(如 /%postname%/)后,需要 Nginx 将“漂亮”的 URL 重写(rewrite)到 WordPress 的 index.php 前端控制器。
以下是适用于 WordPress 的推荐配置:
server {
listen 80;
server_name demo.example.com;
root /var/www/demo_example_com;
index index.php index.html index.htm;
# WordPress 伪静态规则(核心)
location / {
try_files $uri $uri/ /index.php?$args;
}
# 处理 PHP 文件
location ~ .php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 重定向 /wp-admin 到 /wp-admin/
rewrite ^/wp-admin$ $scheme://$host$uri/ permanent;
# 其他优化:禁止访问敏感文件
location ~* /.(htaccess|htpasswd|git|svn)$ {
deny all;
}
location ~* /(wp-config.php|readme.html|license.txt)$ {
deny all;
}
access_log /var/log/nginx/demo.example.com.access.log;
error_log /var/log/nginx/demo.example.com.error.log;
}
核心说明:try_files $uri $uri/ /index.php?$args; 是 WordPress 伪静态的“黄金法则”。它会按顺序检查:1) 请求的文件是否存在;2) 请求的目录是否存在;3) 如果都不存在,则将请求转发给 index.php,并保留所有查询参数($args)。
如果您使用的是 LNMP 一键安装包,通常已包含一个优化过的 WordPress 配置文件(如 wordpress.conf),可以直接在 server 块中引入:
include wordpress.conf;
常见问题:WordPress 后台 404
如果访问 WordPress 管理后台(/wp-admin)出现 404 错误,通常是因为缺少末尾的斜杠。上述配置中的 rewrite 规则会自动将 /wp-admin 重定向到 /wp-admin/,以解决此问题。
总结
通过以上步骤,您可以完成 Nginx 虚拟主机从基础到进阶的配置。关键点在于:1) 正确配置 server 块;2) 通过 PHP-FPM 处理 PHP;3) 使用 try_files 指令实现 WordPress 伪静态。建议每次修改配置后,使用 nginx -t 命令测试语法,确认无误后再重启服务。