Как настроить проксирование nginx.conf на фронтенд?

Ссылка скопирована
1 ответ

Добрый день!
Настраиваю Nginx для совместной работы backend и frontend приложений своего проекта, сервисы развернуты через Docker.

1. Подключил конфигурационный файл nginx.conf, задав проксирование на backend по location = /api/, указал необходимые параметры заголовков:

upstream backend {     server backend:8000; } server {     listen 80;     server_name localhost;      location /api/ {         proxy_pass http://backend;         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;     }      location /static/ {        alias /app/workograd/static/;     }     location /media/ {        alias /app/workograd/media/;     } }

upstream backend { server backend:8000; } server { listen 80; server_name localhost; location /api/ { proxy_pass http://backend; 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; } location /static/ { alias /app/workograd/static/; } location /media/ { alias /app/workograd/media/; } }

В данной конфигурации все работает исправно, открываются реализованные страницы через 3000 порт (localhost:3000/account/, к примеру), все необходимые ручки backend-стороны отвечают, проксируясь сперва на 80-й порт nginx-a, а после на 8000-й backend приложения.

2. Далее, пытаюсь подключить location "/" для frontend-части:

upstream backend {     server backend:8000; }  upstream frontend {     server frontend:3000; }  server {     listen 80;     server_name localhost;      location /api/ {         proxy_pass http://backend;         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;     }      location / {         proxy_pass http://frontend;         proxy_http_version 1.1;         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;     }      location /static/ {        alias /app/workograd/static/;     }     location /media/ {        alias /app/workograd/media/;     } }

upstream backend { server backend:8000; } upstream frontend { server frontend:3000; } server { listen 80; server_name localhost; location /api/ { proxy_pass http://backend; 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; } location / { proxy_pass http://frontend; proxy_http_version 1.1; 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; } location /static/ { alias /app/workograd/static/; } location /media/ { alias /app/workograd/media/; } }

В данной конфигурации, реализованные страницы front-приложения по пути localhost/account/ (и других) не открываются, при этом, доступность через 3000-й порт контейнера сохраняется.
В чем может быть проблема? Возможно что-то элементарное упускаю.

Nginx отрисовывает подобные логи (кэш пробовал чистить):

project-nginx-1 | 171.22.0.1 - - [14/Mar/2024:18:32:17 +0000] "GET /login/ HTTP/1.1" 304 0 "127.0.0.1/account" "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Mobile Safari/537.36" "-"

Буду благодарен за любой совет, благодарю!

Дополнительно:

Если оставить только бэк, то всё работает?

  • Drno, да, в п.1 описано
  • доступность через 3000-й порт контейнера сохраняется.

    Покажи-ка свой compose

  • Valentin Barbolin,
    version: "3.3" services:    db:     restart: always     image: postgres:14.6-alpine     ports:       - "15163:5432"     env_file:       - ./backend/.env    backend:     build:       context: ./backend     ports:       - "8000:8000"     command: >       sh -c "       cd ./workograd &&       python manage.py collectstatic --noinput &&       python manage.py migrate &&       gunicorn workograd.wsgi:application -b 0.0.0.0:8000 --max-requests 10000 --log-level info --access-logfile - --error-logfile -       "     env_file:       - ./backend/.env     volumes:       - static_volume:/app/workograd/static       - media_volume:/app/workograd/media     depends_on:       - db    frontend:     build: ./frontend     restart: always     ports:       - "3000:3000"      command: npm start     depends_on:       - backend    nginx:     build:       context: ./nginx     ports:       - "80:80"     volumes:       - static_volume:/app/workograd/static       - media_volume:/app/workograd/media     depends_on:       - backend  volumes:    static_volume:    media_volume:

    version: "3.3" services: db: restart: always image: postgres:14.6-alpine ports: - "15163:5432" env_file: - ./backend/.env backend: build: context: ./backend ports: - "8000:8000" command: > sh -c " cd ./workograd && python manage.py collectstatic --noinput && python manage.py migrate && gunicorn workograd.wsgi:application -b 0.0.0.0:8000 --max-requests 10000 --log-level info --access-logfile - --error-logfile - " env_file: - ./backend/.env volumes: - static_volume:/app/workograd/static - media_volume:/app/workograd/media depends_on: - db frontend: build: ./frontend restart: always ports: - "3000:3000" command: npm start depends_on: - backend nginx: build: context: ./nginx ports: - "80:80" volumes: - static_volume:/app/workograd/static - media_volume:/app/workograd/media depends_on: - backend volumes: static_volume: media_volume:

  • Сильно подозреваю что надо настраивать ваш фронтенд.
    Откройте в браузере консоль и посмотрите на ошибки.
    Вангую ошибки CORS потому что фронт отдаёт html со ссылками на скрипты/стили на порту 3000.
  • Lynn «Кофеман»,
    Только такие, CORS сразу устранил:

    Как настроить проксирование nginx.conf на фронтенд?

    Как настроить проксирование nginx.conf на фронтенд?

  • P.S. вместо alias лучше использовать root если последняя часть alias совпадает с location
    server {     listen 80;     server_name localhost;     root /app/workograd;      location / {         # proxy to frontend         ...     }     location /api/ {         # proxy to backend         ...     }      location /static/ {         # ничего не нужно, /static/ допишется к root выше и получится то что надо.     }     location /media/ {         # ничего не нужно     } }

    server { listen 80; server_name localhost; root /app/workograd; location / { # proxy to frontend ... } location /api/ { # proxy to backend ... } location /static/ { # ничего не нужно, /static/ допишется к root выше и получится то что надо. } location /media/ { # ничего не нужно } }

  • Ilya_00, ну так 304 это не ошибка
    Выясняйте куда у вас пропал bundle.js
  • Ilya_00, При запросе на 127.0.0.1/account в логе npm ничего нет?
  • Lynn «Кофеман», благодарю!
    статику фронтенд-приложения дополнительно подключил, все получилось!
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Кирилл JS Ответ

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

    Вот пример того, как можно настроить проксирование в Nginx:

    1. Откройте файл nginx.conf в вашем текстовом редакторе. Обычно файл находится в директории /etc/nginx/nginx.conf или /usr/local/nginx/conf/nginx.conf.

    2. Найдите блок server {} для вашего сайта и добавьте следующий код:

    server {
        listen 80;
        server_name example.com;
     
        location / {
            proxy_pass http://backend_server; # замените на адрес вашего бэкенд-сервера
            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;
        }
    }

    server { listen 80; server_name example.com; location / { proxy_pass http://backend_server; # замените на адрес вашего бэкенд-сервера 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; } }

    3. Замените example.com на ваш домен, а backend_server на адрес вашего бэкенд-сервера.

    4. После внесения изменений сохраните файл nginx.conf и перезапустите Nginx командой:

    ```
    sudo systemctl restart nginx
    ```

    Теперь все запросы, поступающие на ваш фронтенд-сервер по указанному домену, будут проксироваться на ваш бэкенд-сервер. Убедитесь, что бэкенд-сервер настроен правильно и готов принимать проксированные запросы.

    Если у вас возникнут какие-либо проблемы или вопросы, не стесняйтесь задавать их здесь для получения более подробной помощи.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно