2

I have created a django project called "yo" in my /home/ubuntu/test directory.

These are my nginx files:

nginx/sites-available/yo

    server {
        listen 80;
        server_name 52.89.220.11;

        location = /favicon.ico { access_log off; log_not_found off; }
        location /static/ {
            root /home/ubuntu/test/yo/static;
        }

        location / {
            include uwsgi_params;
            uwsgi_pass unix:/home/ubuntu/test/yo/yo.sock;
        }
    }

nginx/sites-enabled/yo_nginx.conf:

# mysite_nginx.conf

# the upstream component nginx needs to connect to
upstream django {
    # server unix:///home/Ubuntu/test/yo/yo.sock; # for a file socket
    server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}

# configuration of the server
server {
    # the port your site will be served on
    listen      80;
    # the domain name it will serve for
    server_name 52.89.220.11; # substitute your machine's IP address or FQDN
    charset     utf-8;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    # Django media
 #   location /media  {
  #      alias /path/to/your/mysite/media;  # your Django project's media files - amend as required
   # }

    #location /static {
    #   alias /path/to/your/mysite/static; # your Django project's static files - amend as required
  }

# Finally, send all non-media requests to the Django server.
location / {
    uwsgi_pass  django;
    include     /home/ubuntu/test/yo/uwsgi_params; # the uwsgi_params file you installed
}
}

/home/ubuntu/test/yo/uwsgi_params:

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

There are my files along with their url. When i go to the domain_name on port 80, i get 502 bad gateway instead of django success page. Please help.

7
  • Why do you have 2 different nginx config files ? And why do you have a location block that is not in a server block ? Commented Sep 18, 2016 at 8:46
  • I followed some links and did what they said. Maybe you can help. Commented Sep 18, 2016 at 9:00
  • Well you should use better links, the file in sites_enabled is supposed to be the same as the one in sites_available, and a location block belongs to a server block. Fix that already and if there is always a problem post the error messages of nginx and uwsgi. Commented Sep 18, 2016 at 9:05
  • sites-enabled and sites-available are exactly the same and location block is inside the server block only. Maybe it got messed up while posting it here. btw i followed this link uwsgi.readthedocs.io/en/latest/tutorials/Django_and_nginx.html Commented Sep 18, 2016 at 9:10
  • @polku are my configuration files correct? Commented Sep 18, 2016 at 9:21

2 Answers 2

2

First install required applications. sudo apt-get install nginx uwsgi uwsgi-plugin-python python-virtualenv Versions of packages that will be used:

Nginx
Uwsgi 
Virtualenv
Django 
Virtualenv.

I store my project in ~/projects. Now I'm creating python virtual environment for my project and I'm installing Django.

cd ~/projects/
virtualenv example.com
cd example.com
source bin/activate
pip install django
django-admin.py startproject project

Nginx configuration. IMHO, by default, nginx is configured for basic tasks. I won't change this configuration in this entry. Configuration files are stored in

/etc/nginx/sites-available. Go to this directory and create a new file.
cd /etc/nginx/sites-available

vim example.com It's example configuration.

server {
    listen  80;
    server_name eample.com,www.example.com;
    access_log /var/log/nginx/eample.com_access.log;
    error_log /var/log/nginx/example.com_error.log;

    location / { 
        uwsgi_pass  unix:///tmp/example.com.sock;
        include     uwsgi_params;
    }

    location /media/  {
        alias /home/eshlox/projects/example.com/project/project/media/;
    }

    location  /static/ {
        alias  /home/eshlox/projects/example.com/project/project/static/;
    }
}

We must create symlink to enable this.

cd /etc/nginx/sites-enabled

ln -s ../sites-available/example.com .

Uwsgi. Like with Nginx.. configuration files are stored in /etc/uwsgi/apps-available. Go to this directory and create a new file.

cd /etc/uwsgi/apps-available
vim example.com.ini

Edit example.com.ini [uwsgi]

vhost = true
plugins = python
socket = /tmp/example.com.sock
master = true
enable-threads = true
processes = 2
wsgi-file = /home/eshlox/projects/example.com/project/project/wsgi.py
virtualenv = /home/eshlox/projects/example.com
chdir = /home/eshlox/projects/example.com/project
touch-reload = /home/eshlox/projects/example.com/project/reload

Enable this.

cd /etc/uwsgi/apps-enabled/
ln -s ../apps-available/example.com.ini .
That's all. Now, run this services.
sudo service nginx start
sudo service uwsgi start
Sign up to request clarification or add additional context in comments.

Comments

1
  • you have unmatched parens in your nginx/sites-enabled/yo_nginx.conf
  • nginx/sites-available/yo is not read by nginx - only files ending in .conf and located in nginx/sites-enabled/ are read in default nginx configuration.
  • since your command line uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=664 tells uwsgi to listen on unix socket, your upstream django block should be modified accordingly.

That should get rid of the 502 error.

upstream django {
    server unix:///home/ubuntu/test/yo/mysite.sock; # for a file socket, check if the path is correct
    # server 127.0.0.1:8001; # for a web port socket
}

# configuration of the server
server {
    # the port your site will be served on
    listen      80;
    # the domain name it will serve for
    server_name 52.89.220.11; # substitute your machine's IP address or FQDN
    charset     utf-8;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    # Django media
    #   location /media  {
    #      alias /path/to/your/mysite/media;  # your Django project's media files - amend as required
    # }

    # location /static {
    #     alias /path/to/your/mysite/static; # your Django project's static files - amend as required
    # }

# Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     /home/ubuntu/test/yo/uwsgi_params; # the uwsgi_params file you installed
    }
}

5 Comments

I will let you know in a few minutes.
this is what the error log is saying: 2016/09/18 11:44:30 [error] 10853#0: *65 connect() failed (111: Connection refused) while connecting to upstream, client: 103.61.255.51, server: 52.89.220.11, request: "GET /favicon.ico HTTP/1.1", upstream: "uwsgi://127.0.0.1:8001", host: "52.89.220.11", referrer: "52.89.220.11"
Did you restart nginx after editing the config file? Because the log says it's still trying to connect using web port (as in your original yo_nginx.conf) instead of unix socket.
I changed the permission level of the .sock file in my project and the test.py file runs elegantly with nginx but when I tried executing it with this command: sudo uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=666, it again gave an error saying connection refused and I did restart my server this time and its pointing in the right place.
Never mind it worked :D It was a permission level issue. thanks :)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.