大地主的知识库
专注于收集、整理和分享各种各样的知识信息

在同一域名下使用 Nginx 部署 Django 和 WordPress 的完整指南

在 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/

解决方案概述

  1. 将根路径 / 指向 WordPress:在 Nginx 配置中,将根目录设置为 WordPress 的目录,使默认访问显示 WordPress 网站。
  2. 为 Django 应用设置特定的 URL 路径:在 Nginx 中为 Django 应用的所有 URL 路径添加 location 块,将这些请求转发给 Django 应用。
  3. 处理静态和媒体文件:确保 Django 应用的静态文件和媒体文件能够被正确访问。
  4. 配置 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。
处理好静态文件和媒体文件的访问。
希望本文能够帮助您在实际项目中实现类似的需求。
赞(0) 打赏
未经允许不得转载:大地主的知识库 » 在同一域名下使用 Nginx 部署 Django 和 WordPress 的完整指南

评论 抢沙发

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

微信扫一扫打赏

登录

找回密码

注册