Запуск Nginx в качестве обратного прокси для gunicorn и apache2

Я хочу использовать nginx как реверс для apache и gunicorn

location / должен быть обработан Apache

location /webapps/должен быть обработан Gunicorn

upstream gfbu_app_server {
        server unix:/webapps/gfbu/run/gunicorn.sock fail_timeout=0;
        }

server {
        listen  80;
        server_name eu-con.gfbu;

        client_max_body_size 4G;

        access_log /webapps/gfbu/logs/nginx-access.log;
        error_log /webapps/gfbu/logs/nginx-error.log;

        location /static/ {
                alias /webapps/gfbu/gfbu/static/;
        }
        location /media/ {
                alias /webapps/gfbu/gfbu/media/;
        }

        location /webapps/ {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;
        if (!-f $request_filename) {
                proxy_pass http://gfbu_app_server;
                break;
                }
        }

        error_page 500 502 503 504 /500.html;
        location = 500.html {
                root /webapps/gfbu/static/;
                }

        # everything to apache
        location / {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_set_header Host $host;
                proxy_pass http://127.0.0.1:8090;
                }

Это работает вроде как, но URL запроса для gunicorn http://<ipaddress>/webapps/ но это должно быть / работать.

Gunicorn обслуживает Django Webapp и не может соответствовать http://<ipaddress>/webapps/ на любой шаблон URL. Понятно, что я сделал что-то не так - исходя из Apache и mod_wsgi, можно было перенаправить запрос на указанный wsgi_script без части subdir.

Я не уверен, какая часть стека nginx -> gunicorn -> django настроена неправильно - не могли бы вы мне помочь?

1 ответ

Решение

Замещать

proxy_pass http://gfbu_app_server;

С:

proxy_pass http://gfbu_app_server/;

Это не будет работать с блоком if. Чтобы не нарушать автоматически сгенерированный URL Djangos (помните: Django считает, что он работает в корне документа), вы должны добавить FORCE_SCRIPT_NAME переменная к settings.py например:

FORCE_SCRIPT_NAME = "/webapps"

Также проверьте, нужно ли вам изменить перенаправления для LOGIN_URL и LOGOUT_URL

Другие вопросы по тегам