Django在一个域下将两个单独的项目作为子目录

时间:2020-11-03 13:16:18

标签: django nginx

我正在尝试在一个域名下配置两个单独的Django项目作为子目录, 所以我可以将项目1打开为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

}

此配置有效,如上所述,我可以将其打开,这里的问题是静态的,媒体位置不起作用,是否有任何解决方法可以使其正常工作,请您指导我以实现它。这将对我非常有帮助。预先感谢。

1 个答案:

答案 0 :(得分:0)

为我的问题找到了解决方案

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>' %}

project1 settings.py

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

project2 settings.py

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

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