Развертывание приложения Django на Alibaba ECS - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь развернуть простое приложение todo на Alibaba ECS.

Это приложение Django, и я пытаюсь развернуть его с помощью gunicorn и nginx.

Однако, после настройки необходимых файлов, когда я пытаюсь получить доступ к http://149.129.136.180/, я получаю сообщение - «Сайт не может быть достигнут. 149.129.136.180 слишком долго не отвечал».

Вот необходимые данные:

ОС: Ubuntu 16.04.4 LTS (универсальная версия GNU / Linux 4.4.0-117 x86_64)

root@iZa2asghjgdfsdjfsgukZ:~# cat /etc/systemd/system/gunicorn.service 
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=root
Group=www-data
WorkingDirectory=/root/todo
ExecStart=/root/.virtualenvs/todo_venv/bin/gunicorn --workers 3 --bind unix:/root/todo/todo.sock todo.wsgi:application
[Install]
WantedBy=multi-user.target

root@iZa2asghjgdfsdjfsgukZ:~# sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful


root@iZa2asghjgdfsdjfsgukZ:~# cat /etc/nginx/sites-available/todo 
server {
  listen 80;
  server_name 149.129.136.180;
  location = /favicon.ico { access_log off; log_not_found off; }
  location / {
      include proxy_params;
      proxy_pass http://unix:/root/todo/todo.sock;
  }
}

root@iZa2asghjgdfsdjfsgukZ:~# sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/nginx.service.d
           └─override.conf
   Active: active (running) since Tue 2018-09-18 17:11:07 CST; 10min ago
  Process: 996 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)
  Process: 1012 ExecStartPost=/bin/sleep 0.1 (code=exited, status=0/SUCCESS)
  Process: 1005 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 1000 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 1009 (nginx)
   CGroup: /system.slice/nginx.service
           ├─1009 nginx: master process /usr/sbin/nginx -g daemon on; master_process on
           ├─1010 nginx: worker process                           
           └─1011 nginx: worker process                           

Sep 18 17:11:07 iZa2deepdarscg4q4vwgukZ systemd[1]: Starting A high performance web server and a reverse proxy server...
Sep 18 17:11:07 iZa2deepdarscg4q4vwgukZ systemd[1]: Started A high performance web server and a reverse proxy server.


root@iZa2asghjgdfsdjfsgukZ:~# sudo journalctl -u gunicorn
-- Logs begin at Sun 2018-04-08 21:14:21 CST, end at Tue 2018-09-18 17:22:20 CST. --
Sep 18 17:03:21 iZa2deepdarscg4q4vwgukZ systemd[1]: Started gunicorn daemon.
Sep 18 17:03:22 iZa2deepdarscg4q4vwgukZ gunicorn[675]: [2018-09-18 17:03:22 +0800] [675] [INFO] Starting gunicorn 19.9.0
Sep 18 17:03:22 iZa2deepdarscg4q4vwgukZ gunicorn[675]: [2018-09-18 17:03:22 +0800] [675] [INFO] Listening at: unix:/root/todo/todo.sock (675)
Sep 18 17:03:22 iZa2deepdarscg4q4vwgukZ gunicorn[675]: [2018-09-18 17:03:22 +0800] [675] [INFO] Using worker: sync
Sep 18 17:03:22 iZa2deepdarscg4q4vwgukZ gunicorn[675]: [2018-09-18 17:03:22 +0800] [796] [INFO] Booting worker with pid: 796
Sep 18 17:03:22 iZa2deepdarscg4q4vwgukZ gunicorn[675]: [2018-09-18 17:03:22 +0800] [801] [INFO] Booting worker with pid: 801
Sep 18 17:03:22 iZa2deepdarscg4q4vwgukZ gunicorn[675]: [2018-09-18 17:03:22 +0800] [802] [INFO] Booting worker with pid: 802

Однако я могу просматривать свое приложение (используя предоставленный IP-адрес) при запуске приложения через:

python manage.py runserver

и

gunicorn --bind 0.0.0.0:8000 todo.wsgi:application

1 Ответ

0 голосов
/ 18 сентября 2018

Я собираюсь предположить, что ваша проблема связана с файлом конфигурации nginx.Я приложил приведенную ниже конфигурацию (хотя и не проверенную), поэтому вы можете отредактировать свою конфигурацию так, чтобы она выглядела примерно так:

Если говорить точнее, не ссылайтесь на сокет unix с http:// в начале.Переместите это в отдельное объявление server в блоке upstream app_server.

Затем можно использовать proxy_pass для ссылки http://app_server

http {

    upstream app_server {
        # 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:/root/todo/todo.sock fail_timeout=0;

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

    server {
        # if no Host match, close the connection to prevent host spoofing
        listen 80 default_server;
        return 444;
    }

    server {
        listen 80;
        server_name 149.129.136.180;

        location / {
            # checks for static file, if not found proxy to app
            try_files $uri @proxy_to_app;
        } 

        location @proxy_to_app {
            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://app_server;
        }
    }
}
...