Обслуживание нескольких приложений Django с Nginx и Gunicorn в одном домене - PullRequest
0 голосов
/ 11 ноября 2018

Теперь у меня есть один проект Django в одном домене. Я хочу сервировать три проекта Django в одном домене, разделенном /. Например: www.domain.com/firstone/, www.domain.com/secondone/ и т. Д. Как настроить nGinx для обслуживания нескольких Django-проектов в одном домене? Как настроить обслуживание статических файлов в этом случае?

Моя текущая конфигурация nGinx:

server {                                                                                                                             
    listen 80;                                                                                                                       
    listen [::]:80;                                                                                                                  
    server_name domain.com www.domain.com;                                                                               
    return 301 https://$server_name$request_uri;                                                                                     
}                                                                                                                                    

server {                                                                                                                             
    listen       443 ssl;                                                                                                            
    server_name domain.com www.domain.com;                                                                               

    ssl_certificate /etc/nginx/ssl/Certificate.crt;                                                                                  
    ssl_certificate_key /etc/nginx/ssl/Certificate.key;                                                                              

    ssl_session_cache    shared:SSL:1m;                                                                                              
    ssl_session_timeout  5m;                                                                                                         

    ssl_ciphers  HIGH:!aNULL:!MD5;                                                                                                   
    ssl_prefer_server_ciphers  on;                                                                                                   


    root /home/admin/web/project;                                                                                               

    location /static {                                                                                                               
        alias /home/admin/web/project/static;                                                                                   
    }                                                                                                                                
    location /media {                                                                                                                
        alias /home/admin/web/project/media;                                                                                    
    }                                                                                                                                
    location /assets {                                                                                                               
        alias /home/admin/web/project/assets;                                                                                   
    }                                                                                                                                

    location / {                                                                                                                     
        proxy_pass_header Server;                                                                                                    
        proxy_set_header Host $http_host;                                                                                            
        proxy_redirect off;                                                                                                          
        proxy_set_header X-Real-IP $remote_addr;                                                                                     
        proxy_set_header X-Scheme $scheme;                                                                                           
        proxy_set_header X-Forwarded-Proto https;                                                                                    
        proxy_connect_timeout 75s;                                                                                                   
        proxy_read_timeout 300s;                                                                                                     
        proxy_pass http://127.0.0.1:8000/;                                                                                           
        client_max_body_size 100M;                                                                                                   
    }                                                                                                                                
# Proxies                                                                                                                            
#    location /first {                                                                                                                
#        proxy_pass http://127.0.0.1:8001/;                                                                                          
#    }                                                                                                                               
#                                                                                                                                    
#    location /second {                                                                                                                
#        proxy_pass http://127.0.0.1:8002/;                                                                                          
#    }                                                                                                                               

  error_page 500 502 503 504 /media/50x.html;                                                                                        

Ответы [ 3 ]

0 голосов
/ 11 ноября 2018

То, что сказал проф.фифон, должно быть правильным. Я не эксперт в этом, но я видел аналогичную ситуацию и с нашим сервером. Надеюсь, что общий файл nginx.conf поможет!

server {
    listen 80;
    listen [::]:80;
    server_name alicebot.tech;
    return 301 https://web.alicebot.tech$request_uri;
}

server {
    listen 80;
    listen [::]:80;
    server_name web.alicebot.tech;
    return 301 https://web.alicebot.tech$request_uri;
}
server {
    listen 443 ssl;
    server_name alicebot.tech;
    ssl_certificate /etc/ssl/alicebot_tech_cert_chain.crt;
    ssl_certificate_key /etc/ssl/alicebot.key;

    location /static/ {
        expires 1M;
        access_log off;
        add_header Cache-Control "public";
        proxy_ignore_headers "Set-Cookie";
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/var/www/html/alice/alice.sock;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
    }
}

server {
    listen 443 ssl;
    server_name web.alicebot.tech;
    ssl_certificate /etc/letsencrypt/live/web.alicebot.tech/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/web.alicebot.tech/privkey.pem; # managed by Certbot


    location /static/ {
        autoindex on;
        alias /var/www/html/static/;
        expires 1M;
        access_log off;
        add_header Cache-Control "public";
        proxy_ignore_headers "Set-Cookie";
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/var/www/alice_v2/alice/alice.sock;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
    }

}
server {
    listen 8000 ssl;
    listen [::]:8000 ssl;
    server_name alicebot.tech;
    ssl_certificate /etc/ssl/alicebot_tech_cert_chain.crt;
    ssl_certificate_key /etc/ssl/alicebot.key;

    location /static/ {
        autoindex on;
        alias /var/www/alice_v2/static/;
        expires 1M;
        access_log off;
        add_header Cache-Control "public";
        proxy_ignore_headers "Set-Cookie";
    }

    location / {
         include proxy_params;
         proxy_pass http://unix:/var/www/alice_v2/alice/alice.sock;
    }
}

Как видите, у нас здесь были разные доменные имена, которые вам не нужны. Поэтому вам нужно изменить имена серверов внутри сервера {...}

0 голосов
/ 12 ноября 2018

Как правильно указывает @ prof.phython, вам нужно запустить отдельный процесс gunicorn для каждого из приложений. Это приводит к тому, что каждое приложение работает на отдельном порту.

Затем создайте отдельный восходящий блок под http для каждого из этих серверов приложений:

  upstream app1 {
    # fail_timeout=0 means we always retry an upstream even if it failed
    # to return a good HTTP response

    # for UNIX domain socket setups
    #server unix:/tmp/gunicorn.sock fail_timeout=0;

    # for a TCP configuration
     server 127.0.0.1:9000 fail_timeout=0;
  }

Очевидно, соответственно измените заголовок и номер порта для каждого вышестоящего блока.

Затем под вашим http->server блоком определите следующее для каждого:

location @app1_proxy {
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_set_header Host $http_host;
  # we don't want nginx trying to do something clever with
  # redirects, we set the Host: header above already.
  proxy_redirect off;
  proxy_pass http://app1; 
}

Убедитесь, что последняя строка там, указывает на то, что вы назвали вышестоящим блоком (app1), и @app1_proxy также должны быть специфичны для этого приложения.

Наконец, в блоке http->server используйте следующий код для сопоставления URL-адреса с сервером приложений:

location /any/subpath {
  # checks for static file, if not found proxy to app
  try_files $uri @app1_proxy;
} 
0 голосов
/ 11 ноября 2018

Вы должны запускать свои проекты на разных портах, таких как firsrone на 8000 и второй на 8001. Затем в nginx conf вместо location / вы должны записать location /firstone/ и прокси передать его в порт 8000, а затем записать тот же объект местоположения для второго как location /secondone/ и прокси передать его в порт 8001.

Для статических файлов и носителей вы должны сделать их доступными как / firstone / static и так же для secondone. Другой способ - указать MEDIA_ROOT и STATIC_ROOT для обоих проектов одинаково.

...