Continuation from Installation
A rough description and installation of each application See Previous article
flask_web_application/
├── application/
│ ├── __init__.py
│ └── views.py
└── server.py
First, create the main body of Flask called app
__init__.py
from flask import Flask
app = Flask(__name__)
import application.views
After accessing the root directory Just return "Hello, World"
views.py
from application import app
@app.route('/')
def show_entries():
return "Hello World"
Files executed by uWSGI The process starts from here
server.py
from application import app
if __name__ == "__main__":
app.run(host='0.0.0.0')
By the way, this time I made it in / home / ubuntu / application / </ code>
For other directories
Pass permissions in chown to the user running uWSGI
Set the authority to around "775" with chmod
I will explain later, but this time uWSGI
Group name: www-data Username: www-data
Running on
It's just read at startup so you can put it anywhere Easy-to-understand Flask application made this time Put it right under
uwsgi.ini
[uwsgi]
base = /home/ubuntu/application/flask_web_application
module = server:app
virtualenv = /home/ubuntu/py36_flask_server
pythonpath = %(base)
callable = app
uid = www-data
gid = www-data
master = true
processes = 1
threads = 1
socket = /tmp/uwsgi.sock
chmod-socket = 666
vacuum = true
die-on-term = true
thunder-lock = true
Only the main part
variable | Description |
---|---|
base | Application directory |
module | app = Flask(__name__)The app made in |
virtualenv | Python virtual environment directory |
pythonpath | Same as base |
callable | Module to call(app) |
uid | Run by username |
gid | Run by group name |
processes | The number of cores is recommended depending on the environment and application |
threads | FlaskThe number of threads used by Flask, it is not recommended to run Flask in multiple threads(GIL problem) |
socket | UNIX domain socket |
Create the user name and group name specified by uid and gid in advance. www-data should already exist If you do not specify it, it will be executed as root, so it is not very good for security
Various articles that will be helpful https://uwsgi-docs.readthedocs.io/en/latest/ThingsToKnow.html https://qiita.com/yasunori/items/64606e63b36b396cf695 https://qiita.com/wapa5pow/items/f4326aed6c0b63617ebd https://qiita.com/11ohina017/items/da2ae5b039257752e558
$ sudo vi /etc/systemd/system/uwsgi.service
#Add the following
[Unit]
Description=uWSGI
After=syslog.target
[Service]
ExecStart=/home/ubuntu/py36_flask_server/bin/uwsgi --ini /home/ubuntu/application/flask_web_application/uwsgi.ini
# Requires systemd version 211 or newer
RuntimeDirectory=uwsgi
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
Install uWSGI in virtual environment in ExecStart Specify the configuration file created earlier in --ini
Add uWSGI to service
$ sudo systemctl enable uwsgi
Delete conf.d / default.conf if it exists
$ sudo rm /etc/nginx/conf.d/default.conf
Remove / nginx / sites-enabled / default if present
$ sudo rm /etc/nginx/sites-enabled/default
This will make the default site disappear
Create sites-available and sites-enabled if they do not exist
$ sudo mkdir /etc/nginx/sites-available
$ sudo mkdir /etc/nginx/sites-enabled
However, this time I don't use multiple domains separately. Due to the structure of Ubuntu + Nginx + uWSGI More stable than using conf.d
How to use -Create a domain-specific configuration file in sites-available -Create a site-available symbolic link to sites-enabled
Very simple thing Symbolic links are so-called shortcuts
In the http block part of /etc/nginx/nginx.conf Rewrite /etc/nginx/conf.d/*.conf
$ sudo vi /etc/nginx/nginx.conf
http{
…
include /etc/nginx/conf.d/*.conf;
}
↓
http{
…
include /etc/nginx/sites-enabled/*;
}
Added /etc/nginx/sites-available/myapplication.conf
$ sudo vi /etc/nginx/sites-available/myapplication.conf
#Add the following
server {
listen 80;
root /var/www/html;
location / { try_files $uri @yourapplication; }
location @yourapplication {
include uwsgi_params;
uwsgi_pass unix:///tmp/uwsgi.sock;
}
}
Roughly speaking, try_files with the URL as it is A structure that searches from root and internally redirects to uWSGI (with the URL as it is) if it does not exist root has nothing in particular You can throw everything to uWSGI, but the formula is as above
uwsgi_params is a uWSGI configuration file unix: ///tmp/uwsgi.sock is a UNIX domain socket This is what is called to communicate with uWSGI.
You can also connect via TCP, but it will occupy the port. Better to use domain sockets
If you create a shortcut, nginx settings are complete
$ sudo ln -s /etc/nginx/sites-available/myapplication.conf /etc/nginx/sites-enabled/myapplication
$ sudo systemctl restart nginx
If uwsgi is not running, start it
& sudo systemctl start uwsgi
uwsgi error checking
$ sudo systemctl status uwsgi
nginx error checking
$ sudo systemctl status nginx
Read through and if there seems to be no error, try accessing
$ curl http://127.0.0.1
Hello, World
Please let me know if there is something wrong with this
Recommended Posts