Настройка балансировщика нагрузки с использованием nginx

#nginx #nginx-reverse-proxy

#nginx #nginx-обратный прокси

Вопрос:

Я изучаю, как настроить балансировщик нагрузки, используя nginx на AWS.

Я настроил базовый сервер Ubuntu 18.04 на AWS, а затем выполнил следующее:

 sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install nginx -y
  

Затем я заменил /etc /nginx /nginx.conf следующим:

 upstream backend {
    server xxx.24.20.11;
    server xxx.24.20.12;
}

server {
    listen 80;
    location / {
        proxy_pass http://backend;
    }
}
  

Затем я попытался перезапустить сервер nginx, выполнив:

 sudo service nginx stop
sudo service nginx start
  

но я получаю сообщение об ошибке:

 Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xe" for details.
  

Итак, я сделал

 systemctl status nginx.service
  

И вот что я получил:

 nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Wed 2019-04-03 01:13:27 UTC; 23s ago
     Docs: man:nginx(8)
  Process: 1822 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)
  Process: 1748 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 1865 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE)
  Main PID: 1752 (code=exited, status=0/SUCCESS)

Apr 03 01:13:27 load-balancer.xxxx.com systemd[1]: Starting A high performance web server and a reverse proxy server...
Apr 03 01:13:27 load-balancer.xxx.com nginx[1865]: nginx: [emerg] "upstream" directive is not allowed here in /etc/nginx/nginx.conf:2
Apr 03 01:13:27 load-balancer.xxx.com nginx[1865]: nginx: configuration file /etc/nginx/nginx.conf test failed
Apr 03 01:13:27 load-balancer.xxx.com systemd[1]: nginx.service: Control process exited, code=exited status=1
Apr 03 01:13:27 load-balancer.xxx.com systemd[1]: nginx.service: Failed with result 'exit-code'.
Apr 03 01:13:27 load-balancer.xxx.com systemd[1]: Failed to start A high performance web server and a reverse proxy server.
  

Я просмотрел два отдельных руководства, и оба они используют директиву «upstream». Есть идеи?

Редактировать:

Я вернул nginx.conf в исходный формат:

 sudo cp /etc/nginx/nginx.original /etc/nginx/nginx.conf
  

Затем я сделал следующее:

 sudo su
echo > /etc/nginx/sites-available/load-balancer.conf
  

Затем я добавил следующее в /etc /nginx/sites-available/load-balancer.conf

 http {
  upstream backend {
    server docker-one.xxxxxxx.com;
    server docker-two.xxxxxxx.com;
  }

  server {
    listen 80;
    server_name load-balancer.xxxxxxx.com;
    location / {
      proxy_pass http://backend;
    }
  }
}
  

load-balancer.xxxxxxx.com это доменное имя, которое я использую для тестирования, а docker-one и docker-two — это два домена, на которых будет запущено реальное веб-приложение.

Затем я сделал символическую ссылку:

 ln -s /etc/nginx/sites-available/load-balancer.conf /etc/nginx/sites-enabled/
  

затем я перезагрузил сервер. Когда он был восстановлен, я сделал следующее:

 sudo service nginx stop
sudo service nginx start
  

Я получил сообщение об ошибке, в котором говорилось, что служба nginx не удалась, поэтому я сделал:

 systemctl status nginx.service
  

Который выдал мне следующую ошибку:

 ● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Wed 2019-04-03 19:42:34 UTC; 19s ago
     Docs: man:nginx(8)
  Process: 1549 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE)

Apr 03 19:42:34 load-balancer.xxxxxxx.com systemd[1]: Starting A high performance web server and a reverse proxy server...
Apr 03 19:42:34 load-balancer.xxxxxxx.com nginx[1549]: nginx: configuration file /etc/nginx/nginx.conf test failed
Apr 03 19:42:34 load-balancer.xxxxxxx.com systemd[1]: nginx.service: Control process exited, code=exited status=1
Apr 03 19:42:34 load-balancer.xxxxxxx.com systemd[1]: nginx.service: Failed with result 'exit-code'.
Apr 03 19:42:34 load-balancer.xxxxxxx.com systemd[1]: Failed to start A high performance web server and a reverse proxy server.
  

Ответ №1:

Перезаписывая весь nginx.conf, вы удалили http-контекст. восходящий поток разрешен только внутри http {} блока в соответствии с https://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream

Debian / ubuntu использует /etc /nginx/sites-available/* для определений сайтов, вот где вам нужно создать свой собственный конфигурационный файл, по одному для каждого виртуального хоста, если это необходимо. А затем включите его, чтобы он стал символически связан с /etc /nginx/sites-enabled/*. Или для простоты используйте /etc/nginx/sites-available/default в качестве существующего файла конфигурации, внесите туда свои изменения. Сохраните оригинал, пока он не заработает. И перезагрузите nginx после указанных изменений. Восстановите исходный файл /etc /nginx/nginx.conf также, конечно.

Комментарии:

1. Я попробовал это с контекстом http, и это тоже не сработало. Это не связано с тем, что nginx не может найти файл конфигурации

2. Как указано в вашем сообщении об ошибке и вашем описании, вы полностью удалили файл nginx.conf по умолчанию, перезаписав его блоком конфигурации, который должен находиться внутри остальной части конфигурации. Какое сообщение об ошибке в журналах на этот раз? Это не просто «не сработало». Как уже говорилось, восстановите исходное состояние nginx и измените файл по умолчанию внутри каталога «сайты-доступные». Возможно, после чистой установки nginx вы также захотите подтвердить, что он работает как есть.

3. Насколько я знаю, установка nginx по умолчанию работает из коробки просто отлично. В случае, если он сообщает о чем-то вроде nginx.conf, который не прошел тест, вам пришлось что-то изменить в нем, а не в оригинальном. Итак, в случае, если вы испортили его конфигурацию и не можете вернуть ее вручную, лучше всего удалить и очистить указанное приложение и установить его чисто, чтобы перейти к состоянию, в котором оно изначально работает. Затем продолжайте редактировать правильные конфигурационные файлы…

4. Да, установка по умолчанию работает. Мой вопрос касается настройки nginx в качестве балансировщика нагрузки, и я следовал руководству о том, как это сделать

5. Да, пару раз не удалось прочитать и понять ваши сообщения, это немного не укладывается у меня в голове. Возможно, кто-то еще может помочь.