Gunicorn没有使用" .sock"来绑定我的域名。文件

时间:2016-03-16 20:47:15

标签: django nginx gunicorn

我正在尝试使用sock文件在VPS上托管多个站点,但问题是我无法使用gunicorn sock看到网站运行。但我无法看到我的网站直播。我需要知道如何更改以下屏幕,显示我的应用程序与特定端口绑定而不是sock文件,或者如果它必须是一个sock文件,那么为什么我无法在mydomain.com的浏览器中看到它。

Gunicorn上标如下:

#!/bin/bash

NAME="dressika"                                     # Name of the application
DJANGODIR=/django/mydomain      # Django project directory
SOCKFILE=/django/mydomain/run/gunicorn.sock         # we will communicte using this unix socket
USER=django                                         # the user to run as
GROUP=django                                        # the group to run as
NUM_WORKERS=3                                       # how many worker processes should Gunicorn spawn
DJANGO_SETTINGS_MODULE=mydomain.settings            # which settings file should Django use
DJANGO_WSGI_MODULE=mydomain.wsgi                    # WSGI module name

echo "Starting $NAME as `whoami`"

# Activate the virtual environment
cd $DJANGODIR
source ../bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

# Start your Django Unicorn
# Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)
exec ../bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
  --bind=unix:$SOCKFILE \
  --name $NAME \
  --workers $NUM_WORKERS \
  --user=$USER --group=$GROUP \
  --log-level=debug \
  --log-file=-

通过上述设置,gunicorn启动脚本运行正常,但我无法在浏览器或客户端看到我的网站。我想我需要将它绑定到某个端口。我不确定我的假设是否正确。我的app settings.py显示在ALLOWED_HOSTS=['mydomain.com', 'www.mydomain.com]中。网址仍然无效。

我的Nginx设置为:

upstream mydomain_server {
    server 127.0.0.1:9500 fail_timeout=0;

}


server {
    listen 80;
    listen [::]:80;


    root /home/django/mydomain;
    index index.html index.htm;

    client_max_body_size 4G;
    server_name mydomain.com www.mydomain.com;



    keepalive_timeout 5;

    location ~*  \.(jpg|jpeg|png|gif|ico|css|js|woff2|woff|ttf)$ {
        expires 365d;

    }



    # Your Django project's media files - amend as required
    location /media  {
        alias /home/django/mydomain/media/;
    }

    # your Django project's static files - amend as required
    location static/static-only {
        alias /home/django/mydomain/static-only/; 

    }
    # Django static images
    location /static/mydomain/images {
        alias /home/django/mydomain/static-only/images/;
    }


    # Proxy the static assests for the Django Admin panel
    location /static/admin {
       alias /usr/lib/python2.7/dist-packages/django/contrib/admin/static/admin;
    }

    location / {


        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://mydomain_server;
        proxy_connect_timeout 60s;

    }
}

我还尝试将/home/django/mydomain/run/gunicorn.sock绑定到上游服务器而不是IP:端口,但仍然无法看到网站启动并运行。

3 个答案:

答案 0 :(得分:0)

由于gunicorn在套接字上运行,您需要绑定到该套接字,而不是绑定到上游部分的端口。

upstream mydomain_server {
    server unix:/home/django/mydomain/run/gunicorn.sock fail_timeout=0;
}

答案 1 :(得分:0)

我遇到同样的问题,.sock没有创建。这种方法对我有帮助。 Prerequests:

  1. 已安装的nginx:当您在浏览器127.0.0.1中键入时 - 获取“Wellcome to nginx ...”。
  2. 你安装python2或3,不管其他东西:pip,django,gunicorn ......
  3. 你安装并解决了virtualenv。 (在我的情况下,我使用virtualenvwrapper - 这是很好的员工,将你所有的环境保存在一个文件夹中:/home/user/.virtualenvs/
  4. 您创建了django项目,以及何时:python manage.py runserver - 你获得“它的作品......” - 这个好消息。
  5. 当您输入gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application时 - 您的结果与第4步相同。
  6. 将dj.project throgh gunicorn设置为nginx的下一步:

    1. 您在/etc/systemd/system/any_file_name.service中创建文件 - 您可以根据需要命名此文件,位于DO - 它的名称为gunicorn.service
    2. 我的方法:

      $cd /etc/systemd/system
      
      $sudo touch gunicorn.service
      

      然后打开你最喜欢的文本编辑器

      $sudo subl gunicorn.service
      
      1. 在里面你写道:
      2. [Unit]
        Description=gunicorn daemon
        After=network.target
        
        [Service]
        User=vetal
        Group=www-data
        WorkingDirectory=/var/www/apple.net
        ExecStart=/home/vetal/.virtualenvs/univ/bin/gunicorn --workers 3 --bind unix:/var/www/apple.net/mysite/mysite.sock mysite.wsgi:application
         [Install] WantedBy=multi-user.target
        

        ExecStart - 当你的virualenv被关闭时,nginx会启动什么。你还记得,当你的环境打开时,gunicorn是通过点子安装的吗? - 绑定unix:... - 这个地址是你的.sock创建的地方!注意这个!

        检查每一封信!TWISE !!! (当然有你链接..)

        1. 类型:
        2.   

          $ ls -l <​​/ p>

          如果你在'gunicorn.service'的属性中看到了什么:

          -rw-r--r-- 1 root root    0 Янв 12 11:48 gunicorn.service
          

          这意味着 - 此文件不可执行,而您.sock - 文件永远不会创建!下一步:

          $sudo chmod 755 gunicorn.service
          

          并检查:

          $ls -l
          

          如果你得到:

          -rwxr-xr-x 1 root root  305 Янв 11 19:48 gunicorn.service
          
          这很好!一切都好!

          1. 然后你创建了nginx块,在/ etc / nginx / site-available /它喜欢下一个:
          2. server {
                listen 80;
                root /var/www/apple.net;
            
                server_name apple.net;
                location = /favicon.ico { access_log off; log_not_found off; }
            
                location = /static/ {
                        alias /var/www/apple.net/static/;
                }
                location / {
                        include proxy_params;
                        proxy_pass http://unix:/var/www/apple.net/mysite/mysite.sock;
                } }
            

            注意:proxy_pass - 必须与在gunicorn.service中创建.sock文件的文件夹正确相同!

            1. 将此文件复制到/sites-enable

              $ sudo cp /etc/nginx/site-avaliable/apple.net / etc / nginx / site-enable

            2. 我没有任何域名,所以我修改了我的/etc/hosts文件,添加了行:

            3.   

              127.0.0.10 apple.net

              1. 非常重要的步骤!!!
              2. $pkill gunicorn - 这一步杀死守护进程,你可以在之前开始。在这种情况下,gunicorn表示您在/etc/systemd/system - 文件夹中使用.service扩展之前创建的文件的名称。

                1. 启动gunicorn.service守护程序:
                2. $sudo systemctl start gunicorn
                  
                  $sudo systemctl enable gunicorn
                  
                  1. 开始(或重新启动nginx)
                  2.   

                    $ sudo /etc/init.d/nginx(重新)开始

                    1. 在浏览器中检查您的域名。

答案 2 :(得分:0)

我有nginx从gunicorn提供.sock文件。我典型的gunicorn电话看起来像这样:

exec gunicorn \
    --pid /web/gunicorn.pid \
    --workers '4' \
    --name myapp \
    --chdir /src/myapp \
    --bind unix:/web/.sock \
    --log-file=- \
    myapp.wsgi:application

/的我的nginx conf看起来像这样;主要区别似乎是您的proxy_pass语句没有指向.sock文件:

    location / {
        proxy_set_header Host $http_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;

        proxy_pass http://unix:/web/.sock;
    }