This post is part of a series. This list contains all of the posts:
It is very popular to use Nginx and Gunicorn to host a Python website. This guide shows how to install them quickly and correctly.
I used the following sources of information for this post: * https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-gunicorn-and-nginx-on-centos-7 * https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-centos-7
Make sure pip and virtualenv are installed.
virtualenv blog
cd blog
source bin/activate
pip install gunicorn
To get Gunicorn to start at system boot we can use the systemctl
command, which is an alternative to supervisord
or upstart
. Open up this new file:
sudo vi /etc/systemd/system/blog.service
Enter the following:
[Unit]
Description=Gunicorn instance to serve blog
After=network.target
[Service]
User=myuser
Group=nginx
WorkingDirectory=/apps/blog/blog
Environment="PATH=/apps/blog/bin"
#ExecStart=/apps/blog/bin/gunicorn -w 3 --bind 0.0.0.0:5000 run:app
ExecStart=/apps/blog/bin/gunicorn -w 3 --bind unix:blog.sock -m 007 run:app
Restart=always
[Install]
WantedBy=multi-user.target
To get systemctl
to restart a process if it crashed, add Restart=always
like above. With it set to always
, even a kill
to the process won't stop it from restarting. You could alternatively set it to Restart=on-failure
to prevent restarting on a kill
command.
To start it and enable starting on boot:
sudo systemctl start blog
sudo systemctl enable blog
I at first had some trouble getting gunicorn to start. To debug, issue this command to look at the journal, and hit shift+G
to skip to the end:
journalctl
It is working if you see messages like this:
Sep 12 00:41:12 myhost gunicorn[22015]: [2016-09-12 00:41:12 +0000] [22015] [INFO] Starting gunicorn 19.6.0 Sep 12 00:41:12 myhost gunicorn[22015]: [2016-09-12 00:41:12 +0000] [22015] [INFO] Listening at: http://0.0.0.0:5000 (22015) Sep 12 00:41:12 myhost gunicorn[22015]: [2016-09-12 00:41:12 +0000] [22015] [INFO] Using worker: sync Sep 12 00:41:12 myhost gunicorn[22015]: [2016-09-12 00:41:12 +0000] [22020] [INFO] Booting worker with pid: 22020 Sep 12 00:41:12 myhost gunicorn[22015]: [2016-09-12 00:41:12 +0000] [22021] [INFO] Booting worker with pid: 22021 Sep 12 00:41:12 myhost gunicorn[22015]: [2016-09-12 00:41:12 +0000] [22022] [INFO] Booting worker with pid: 22022
A few yum operations are necessary:
# Add CentOS 7 EPEL repo
sudo yum install epel-release -y
sudo yum install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
sudo vi /etc/nginx/nginx.conf
In /etc/nginx/nginx.conf, add the following. Note that this is for an http server. Check out the follow up post on Let's Encrypt and SSL certificates with Ngnix.
user nginx; # ... http { server { #... location / { #proxy_pass http://localhost:5000/ ; 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:/apps/blog/blog/blog.sock; } location /static/ { autoindex on; alias /apps/blog/blog/static/ ; } } }
This post is part of a series. This list contains all of the posts: