0

Trying to set up a Flask application with uWSGI and Nginx.

I keep getting a 502 Bad Gateway error (as far as I know this means uWSGI and Nginx can't communicate correctly)

This is the line that keeps showing up in my /var/log/nginx/error.log:

2016/07/29 17:07:12 [error] 24958#24958: *2 connect() to unix:/home/lit/howlit/how_lit_restapi.sock failed (111: Connection refused) while connecting to upstream, client: 

This is my project directory and it's permissions:

(env) root@digitalocean:/home/lit/howlit# ls -l total 24 drwx---r-x 6 lit www-data 4096 Jul 29 11:47 env -rwx---r-x 1 lit www-data 141 Jul 29 17:00 howlit.ini -rwx---r-x 1 lit www-data 1175 Jul 29 11:52 how_lit_restapi.py -rwx---r-x 1 lit www-data 1781 Jul 29 11:54 how_lit_restapi.pyc srwx---r-x 1 lit www-data 0 Jul 29 16:46 how_lit_restapi.sock -rwx---r-x 1 lit www-data 73 Jul 29 11:54 wsgi.py -rwx---r-x 1 lit www-data 218 Jul 29 11:54 wsgi.pyc 

This is my howlit.ini file:

(env) root@digitalocean:/home/lit/howlit# cat howlit.ini [uwsgi] module = wsgi:app master = true processes = 5 socket = how_lit_restapi.sock chmod-sock = 660 vaccum = true die-on-term = true 

this is my /etc/nginx/sites-available/how_lit file:

(env) root@digitalocean:/home/lit/howlit# cat /etc/nginx/sites-available/how_lit server { listen 80; server_name XXX.XX.XX.XXX; location / { include uwsgi_params; uwsgi_pass unix:/home/lit/howlit/how_lit_restapi.sock; } } 

*the xxxs are to protect my server IP; there is a real IP address there.

Here is the nginx conf file:

user lit; worker_processes auto; pid /run/nginx.pid; events { worker_connections 768; # multi_accept on; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # SSL Settings ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; gzip_disable "msie6"; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } 

Permissions of directory with socket:

root@digitalocean:~# ls -l /home/lit/howlit/

total 24 drwx---r-x 6 lit www-data 4096 Jul 29 11:47 env -rwx---r-x 1 lit www-data 141 Jul 29 19:01 howlit.ini -rwx---r-x 1 lit www-data 1175 Jul 29 11:52 how_lit_restapi.py -rwx---r-x 1 lit www-data 1781 Jul 29 11:54 how_lit_restapi.pyc srwx---r-x 1 lit www-data 0 Jul 29 16:46 how_lit_restapi.sock -rwx---r-x 1 lit www-data 73 Jul 29 11:54 wsgi.py -rwx---r-x 1 lit www-data 218 Jul 29 11:54 wsgi.pyc 

I've tried changing permissions and the files alot. What is my problem here? Why is the connection being refused???

UPDATE:

So when I run my application manually:

root@digitalocean:/home/lit/howlit# python how_lit_restapi.py * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) 

and I go to my ip address at:

XXX.XX.XX:5000 

my app shows up, so I know uwwsgi is running and serving. But the nginx hand off is not work.

Here is my how_lit.service file as well.

root@digitalocean:/home/lit/howlit# vim /etc/systemd/system/how_lit.service [Unit] Description=uWSGI instance to serve how lit rest api After=network.target [Service] User=lit Group=www-data WorkingDirectory=/home/lit/howlit/ Environment="PATH=/home/lit/howlit/env/bin" ExecStart=/home/lit/howlit/env/bin/uwsgi --ini howlit/howlit.ini [Install] WantedBy=multi-user.target 

Okay then now I think I have it. The how_lit service is failing.

3 Answers 3

1

I'd move towards specifying an 'upstream' where you set your server/socket and reference that in your virtual host, like:

upstream django { server unix:///var/run/whatever.sock; # for a file socket } server { listen 80 location / { uwsgi_pass django; } } 

You can use lsof to make sure things are writing to / reading from the socket.

3
  • How does this help with the question asked? Commented Jul 29, 2016 at 22:50
  • could you please explain an upstream? and why this would solve my problem? I thought the ini file takes care of that Commented Jul 29, 2016 at 23:05
  • Upstream is for defining an upstream handler for a virtual host. The ini file takes care of things from the uwsgi side, but uwsgi is upstream from nginx. It's a different approach to the config, but it's what has worked for me in many situations. Commented Jul 31, 2016 at 0:35
0

Which user is running uwsgi? In your config file, you've specified:

chmod-sock = 660 

This means, the user in question and his group are able to read / write, all other users aren't able to do anything. Try changing it to

chmod-sock = 666 

and see how this goes.

A better alternative might be to put the uwsgi user and the one running nginx into the same group.

Edit: Does the socket exist at the path you've specified? If not, change the socket directive so that it uses a full / absolute path.

10
  • i actually dont know whose running uwsgi might be root. but i changed chmod-sock = 666 and nothing happened Commented Jul 29, 2016 at 23:04
  • and yes in that directory there is a .sock file, so there is a socket Commented Jul 29, 2016 at 23:04
  • @KyleCalica-St Did you restart uwsgi afterwards? If so, could you please show the permissions of the socket? Commented Jul 29, 2016 at 23:05
  • I added it the directory listing with the socket at the end. Commented Jul 29, 2016 at 23:58
  • The permissions obviously doesn't correspond to the chmod-sock directive in your config. Could you put the socket (just for debugging) into /tmp/? Of course, alter your nginx config appropriately. Commented Jul 30, 2016 at 0:02
0

These are some of the troubleshooting steps you might need to perform -

1). Check the uwsgi logs, usually under /var/log/uwsig - look for errors and make sure the app you specified in your configuration as module = wsgi:app is loading.

2). Check for any permission issues. To make this easier, start uwsgi under the same user/group as nginx. You can add the line below to your uwsgi config -

 uid = www-data gid = www-data 

3). You might need to install uwsgi-plugin-python package and add plugins = python to your uwsgi config. I had cases where the app was not loading due to missing plugin.

4
  • hmm i dont have a var/log/uwsgi is that because i only installed it through pip? Commented Aug 1, 2016 at 20:13
  • Possibly, you can still specify the log file for uwsgi using logto = /var/log/uwsgi/%n.log for instance. Make sure the user under which uwsgi is running has read/write access to the log directory/file. Commented Aug 2, 2016 at 22:14
  • its actually my service that i made to execute uwsgi that is failing. the service is never up. Commented Aug 4, 2016 at 4:28
  • what do the logs say? Add --logto2 /tmp/mylog.log to your ExecStart line and restart the service and report what you see in the /tmp/mylog.log file. Commented Aug 4, 2016 at 23:08

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.