博客 / Linux/ Nginx 虚拟主机配置详解:从基础到 WordPress 伪静态

Nginx 虚拟主机配置详解:从基础到 WordPress 伪静态

Nginx 虚拟主机配置详解:从基础到 WordPress 伪静态

在 Linux 服务器或 VPS 上配置 Nginx 虚拟主机(Virtual Host)是托管多个网站或应用的基础。本文将从基础配置开始,逐步介绍如何添加虚拟主机、支持 PHP、设置图片防盗链以及配置 WordPress 伪静态规则。

准备工作

本文假设您的 Nginx 服务器已安装完毕。如果您尚未安装,可参考各 Linux 发行版的官方文档,或使用 LNMP 一键安装包(如 lnmp.org)快速部署环境。

增加 Nginx 虚拟主机

配置虚拟主机的主要步骤如下:

  1. 创建配置文件:进入 Nginx 配置目录(通常为 /usr/local/nginx/conf/vhost/etc/nginx/conf.d),创建一个以域名命名的配置文件,例如 demo.example.com.conf
  2. 编写服务器块配置:在配置文件中添加一个 server 块,定义监听端口、域名、网站根目录等核心参数。
  3. 引入配置文件:在主配置文件 nginx.confhttp 块中,使用 include 指令引入虚拟主机配置文件。
  4. 重启 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.confhttp 块中添加:

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 命令测试语法,确认无误后再重启服务。

发表评论

您的邮箱不会公开。必填项已用 * 标注。