Назад | Перейти на главную страницу

Используйте Nginx в качестве обратного прокси для нескольких серверов

Я пытаюсь настроить nginx как обратный прокси для нескольких серверов в моей локальной сети. Они должны выходить в мою WAN с разными поддоменами. Моя конфигурация выглядит так:

@ReverseProxy:/etc/nginx/sites-enabled$ cat reverseproxy 
server { 
  server_name DOMAIN.eu;

  # app1 reverse proxy follow
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://10.0.2.5:80;

}

server { 
  server_name Subdomain.domain.eu;

  # app2 reverse proxy settings follow
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://10.0.2.33:80;
}

Но я получаю эту ошибку и не могу продолжить ...

@ReverseProxy:/etc/nginx/sites-enabled$ nginx -t
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
2009/01/04 12:22:13 [warn] 1302#0: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:1
2009/01/04 12:22:13 [emerg] 1302#0: "proxy_pass" directive is not allowed here in /etc/nginx/sites-enabled/reverseproxy:8

nginx: файл конфигурации /etc/nginx/nginx.conf не прошел проверку

Ваша проблема в том, что вы используете proxy_pass внутри server блокировать, что не допускается. Попробуйте использовать:

server {
    server_name Subdomain.domain.eu;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://10.0.2.33:80;
    }
}

внутри твоего server блок. Параметры прокси не могут быть установлены на server уровень, как документация nginx рассказывает.

Другие проблемы в вашем журнале возникают из-за того, что у вас каким-то образом ваш nginx запускается как обычный пользователь, хотя он должен запускаться как root.

Эта тема решила мою проблему, но я подумал, что другим будет полезно увидеть готовую конфигурацию. Следующая конфигурация будет обратным прокси для имен хостов app1.local и app2.local, где app1 перенаправляется другому приложению, прослушивающему порт 3300, а app2 перенаправляется другому приложению, прослушивающему порт 3000. Он находится в файле здесь /etc/nginx/sites-available/two-applications.conf

server {
  server_name app1.local;

  location ~ {
    proxy_pass_header Authorization;
    proxy_pass http://localhost:3300;
    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_http_version 1.1;
    proxy_set_header Connection "";
    proxy_buffering off;
    client_max_body_size 0;
    proxy_read_timeout 36000s;
    proxy_redirect off;
  }
}

server {
  server_name app2.local;

  location ~ {
    proxy_pass_header Authorization;
    proxy_pass http://localhost:3000;
    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_http_version 1.1;
    proxy_set_header Connection "";
    proxy_buffering off; 
    client_max_body_size 0;
    proxy_read_timeout 36000s;
    proxy_redirect off;
  }
}

Кроме того, эти имена хостов составлены и должны быть в /etc/hosts следующим образом, чтобы они работали:

127.0.0.1       app1.local
127.0.0.1       app2.local

Для полноты (как установка в Ubuntu Linux) этот файл находится в /etc/nginx/sites-available/two-applications.conf и привязан к /etc/nginx/sites-enabled/two-applications.conf Конечно, имя файла и имя символической ссылки могут быть любыми. После обновления этого запущенного sudo service nginx reload заберет сдачу.