首页 > 解决方案 > Django 一个域下的两个独立项目作为子目录

问题描述

我正在尝试将一个域名下的两个单独的 Django 项目配置为子目录,因此我可以将 project1 打开为https://mycompany.example.com/project1并将项目 2 打开为https://mycompany.example.com/project2

这是我的 Nginx 配置

server {
    server_name mycompany.example.com;

    location ~/project1/static {
        alias /home/username/project1/static;
    }

    location ~/project1/media {
        alias /home/username/project1/media;
    }

    location /project1/ {
        rewrite ^/project1/(.*)$ /$1 break;
        proxy_set_header X-Script-Name /project1;
        proxy_pass http://unix:/run/project1.sock;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_redirect     off;
        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-Host $server_name;

    }

    location ~/project2/static {
        alias /home/username/project2/static;
    }

    location ~/project2/media {
        alias /home/username/project2/media;
    }

    location /project2/ {
        rewrite ^/project2/(.*)$ /$1 break;
        proxy_set_header X-Script-Name /project2;
        proxy_pass http://unix:/run/project2.sock;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_redirect     off;
        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-Host $server_name;

    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mycompany.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mycompany.example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

这个配置有效,我可以像上面提到的那样打开它,这里的问题是静态的,媒体位置不起作用,是否有任何解决方法使它起作用,我请求你指导我实现它。这对我很有帮助。提前致谢。

标签: djangonginx

解决方案


找到我的问题的解决方案

Nginx 配置

server {
    server_name mycompany.example.com;

    location /project1/static {
        alias /home/username/project1/static;
    }

    location /project1/media {
        alias /home/username/project1/media;
    }

    location /project1/ {
        rewrite ^/project1/(.*)$ /$1 break;
        proxy_set_header X-Script-Name /project1;
        proxy_pass http://unix:/run/project1.sock;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_redirect     off;
        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-Host $server_name;

    }

    location /project2/static {
        alias /home/username/project2/static;
    }

    location /project2/media {
        alias /home/username/project2/media;
    }

    location /project2/ {
        rewrite ^/project2/(.*)$ /$1 break;
        proxy_set_header X-Script-Name /project2;
        proxy_pass http://unix:/run/project2.sock;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_redirect     off;
        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-Host $server_name;

    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mycompany.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mycompany.example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

在Django中,完整的url必须是{% url '<URL>' %},静态url必须是{% static '<path>' %}

项目1设置.py

STATIC_URL = '/project1/static/'
MEDIA_URL = '/project1/media/'
FORCE_SCRIPT_NAME = '/project1/'

项目2设置.py

STATIC_URL = '/project2/static/'
MEDIA_URL = '/project2/media/'
FORCE_SCRIPT_NAME = '/project2/'

这对我有用,所以现在我可以在一个域名下配置两个或多个不同的 Django 项目作为子目录。希望它会帮助某人...谢谢


推荐阅读