在 Web 开发中,有时需要在同一域名下运行多个不同的应用程序,例如将 Django 应用和 WordPress 博客部署在同一域名下。本文将详细记录并讲解如何在 Nginx 服务器上,通过正确的配置,实现这一需求。
需求分析
- 域名:
www.example.com
- Django 项目路径:
/var/www/django_project
- WordPress 项目路径:
/var/www/wordpress_site
- 目标:
- 访问
https://www.example.com
时,显示 WordPress 网站内容。 - Django 应用的 URL 路径仍然正常工作,例如
https://www.example.com/admin/
。
- 访问
解决方案概述
- 将根路径
/
指向 WordPress:在 Nginx 配置中,将根目录设置为 WordPress 的目录,使默认访问显示 WordPress 网站。 - 为 Django 应用设置特定的 URL 路径:在 Nginx 中为 Django 应用的所有 URL 路径添加
location
块,将这些请求转发给 Django 应用。 - 处理静态和媒体文件:确保 Django 应用的静态文件和媒体文件能够被正确访问。
- 配置 PHP-FPM 和 Gunicorn:确保 PHP-FPM 和 Django 应用(通过 Gunicorn)正常运行。
详细步骤
1. 修改 Nginx 配置
a. 备份现有配置
在修改之前,建议先备份您的 Nginx 配置文件:
cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup
b. 编辑 Nginx 配置
根据您的环境,编辑对应的 Nginx 配置文件,例如 /etc/nginx/sites-available/default
。
c. 配置示例
以下是修改后的 Nginx 配置文件示例:
server {
listen 80;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/ssl_certificate.pem;
ssl_certificate_key /path/to/ssl_certificate_key.pem;
return 301 https://www.example.com$request_uri;
}
server {
listen 80;
listen 443 ssl http2;
server_name www.example.com;
index index.php index.html index.htm default.htm default.html;
root /var/www/wordpress_site; # 将根目录设置为 WordPress 目录
# SSL 配置
ssl_certificate /path/to/ssl_certificate.pem;
ssl_certificate_key /path/to/ssl_certificate_key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;
# 禁止访问的文件或目录
location ~ ^/(\.ht|\.git|\.svn|\.project|LICENSE|README.md|\.env) {
return 404;
}
# SSL 证书验证目录
location /.well-known/ {
root /var/www/letsencrypt;
}
# 禁止在证书验证目录放入敏感文件
if ($uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$") {
return 403;
}
# 处理 Django 应用的静态文件
location ^~ /static/ {
alias /var/www/django_project/static/;
}
# 处理 Django 应用的媒体文件
location ^~ /media/ {
alias /var/www/django_project/media/;
}
# 处理需要转发给 Django 的 URL 路径
location ~ ^/(admin|api|auth|other_paths)/ {
proxy_pass http://127.0.0.1:8000;
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 30s;
proxy_read_timeout 300s;
proxy_send_timeout 30s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# 处理 PHP 脚本(用于 WordPress)
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 根据您的 PHP 版本调整路径
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
}
# 处理 WordPress 的请求
location / {
try_files $uri $uri/ /index.php?$args;
}
# 访问日志和错误日志
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
}
d. 配置解释
将根目录设置为 WordPress
root /var/www/wordpress_site;
这样,默认访问根路径 / 时,将显示 WordPress 网站。
处理 Django 应用的 URL 路径
location ~ ^/(admin|api|auth|other_paths)/ {
proxy_pass http://127.0.0.1:8000;
# 其他代理头设置...
}
使用正则表达式匹配 Django 应用的所有 URL 路径。
将这些请求转发给运行在 127.0.0.1:8000 的 Django 应用。
注意:请将 other_paths 替换为您的 Django 应用实际使用的路径。
处理 Django 的静态和媒体文件
location ^~ /static/ {
alias /var/www/django_project/static/;
}
location ^~ /media/ {
alias /var/www/django_project/media/;
}
确保 Django 的静态文件和媒体文件能够被正确访问。
处理 PHP 脚本(用于 WordPress)
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 根据您的 PHP 版本调整
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 根据您的 PHP 版本调整
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
}
确保 PHP 脚本由 PHP-FPM 处理。
处理 WordPress 的请求
location / {
try_files $uri $uri/ /index.php?$args;
}
支持 WordPress 的友好链接(永久链接)。
注意事项
调整正则表达式
根据您的实际情况,调整 Nginx 配置中的正则表达式,确保所有 Django 应用的 URL 路径都被正确匹配。
PHP-FPM 配置
根据您的 PHP 版本,调整 fastcgi_pass 的路径。例如,PHP 8.0 的路径可能是 /run/php/php8.0-fpm.sock。
文件权限
确保 Nginx 用户对 Django 和 WordPress 项目目录具有适当的权限。
防火墙设置
确保服务器的防火墙没有阻止必要的端口(如 80、443、8000)。
SSL 证书
使用 Let's Encrypt 等免费证书机构获取 SSL 证书,确保网站的 HTTPS 访问正常。
总结
通过正确配置 Nginx,可以在同一域名下同时运行 Django 和 WordPress 应用程序。关键在于:
将根路径指向 WordPress。
为 Django 应用的 URL 路径添加特定的 location 块,将请求转发给 Django。
处理好静态文件和媒体文件的访问。
希望本文能够帮助您在实际项目中实现类似的需求。