前言
最近在学习flask,想做一个简单的示例Demo,并将其部署在服务器上。
因为服务器的80端口已用于展示个人博客,所以会将本项目监听于其他端口,定为8001
。
服务器为Ubuntu 20.04(虚拟机),IP地址:192.168.75.138
正文
项目环境搭建
1.首先创建虚拟环境,项目文件之后也要放到该环境中
创建目录/home/flask_demo,并进入该目录
代码语言:javascript复制sudo mkdir home/flask_demo
cd home/flask_demo
2.安装虚拟环境
命令如下:
代码语言:javascript复制sudo pip install virtualenv
3.生成文件夹ENV_flask,进入其中
命令如下:
代码语言:javascript复制sudo virtualenv ENV_flask
cd ENV_flask
4.激活虚拟环境
命令如下:
代码语言:javascript复制source bin/activate
5.在虚拟环境下安装flask
命令如下:
代码语言:javascript复制sudo pip install flask
6.将flask项目的Demo拷贝至/home/flask_demo/ENV_flask下
这里用到Xftp,也可以采用其他方式
最后ENV_flask目录的结构如下:
代码语言:javascript复制│ .gitignore
│ app.py
│ pyvenv.cfg
│
├─bin
│ ...
│
├─lib
│ ...
│
├─static
│ ├─css
│ │ ...
│ │
│ └─img
│ ...
│
├─templates
│ 404.html
│ base.html
│ index.html
│
└─__pycache__
....
代码语言:javascript复制注意:如果拷贝文件不成功可能是目录权限的问题,需要修改
sudo chmod 777 -R /home/flask_demo/ENV_flask/
7.测试
在该目录下执行命令:
代码语言:javascript复制flask run
在http://127.0.0.1:5000/访问(这里直接展示虚拟机中的浏览器效果)
uwsgi
1.在虚拟环境中安装uwsgi
命令如下:
代码语言:javascript复制sudo pip install uwsgi
2.在虚拟环境中编写uwsgi的配置文件flask_uwsgi.ini,文件名可随意
命令如下:
代码语言:javascript复制vim flask_uwsgi.ini
写入如下内容:
代码语言:javascript复制[uwsgi]
master = true
wsgi-file = app.py
callable = app
http = :8001
processes = 4
threads = 2
buffer-size = 32768
保存
简要说明:
- http=:8001:为了该阶段测试使用
- callable = app:中的app需要与flask的Demo中的application变量名一致
3.测试
在终端键入如下命令启动uwsgi服务:
代码语言:javascript复制uwsgi --ini flask_uwsgi.ini
nohup uwsgi --ini flask_uwsgi.ini #利用nohup可以无日志打印启动
访问8001端口即可看到flask的Demo(这里依然直接用虚拟机的浏览器展示)
如此,便完成了用uwsgi接管flask的目的
Nginx
现在使用Nginx对Demo进行代理
1.首先需要修改上一步在虚拟环境中创建的flask_uwsgi.ini配置文件
代码语言:javascript复制vim flask_uwsgi.ini
对http = :8001条目进行修改
代码语言:javascript复制[uwsgi]
master = true
wsgi-file = app.py
callable = app
socket = 127.0.0.1:8001
processes = 4
threads = 2
buffer-size = 32768
如此,运行的uwsgi服务只能通过本地内部的8001端口进行访问,而不能通过浏览器使用http进行访问。所以下面就需要用nginx来做http代理。
2. 返回根目录,安装Nginx
命令如下:
代码语言:javascript复制cd /
sudo apt-get install nginx
3.修改nginx的配置文件/etc/nginx/sites-available/default
修改server部分
由于之前部署过Hexo的服务,所以直接另外添加一个serve
代码语言:javascript复制...
server {
# listen 80 default_server;
# listen [::]:80 default_server ipv6only=on;
listen 8001; # 监听端口,http默认80
# root /usr/share/nginx/html;
root /home/flask_demo/ENV_flask; # flask项目根路径
# index index.html index.htm;
# Make site accessible from http://localhost/
# server_name localhost;
server_name 192.168.75.138; # 公网ip或已解析ip的域名
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# try_files $uri $uri/ =404;
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules
include uwsgi_params; # 使用nginx内置的uwsgi配置参数文件
uwsgi_pass 127.0.0.1:8001; # 转发请求到该地址端口
uwsgi_param UWSGI_SCRIPT main:app; # 调用的脚本名称和application变量名
}
}
...
所以完整的default配置文件内容如下:
代码语言:javascript复制##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by othe
# applications, such as Drupal or Wordpress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##
# Default server configuration
#
# Hexo
server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
#
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
#
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
root /var/www/hexo;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass PHP scripts to FastCGI serve
#
#location ~ .php$ {
# include snippets/fastcgi-php.conf;
#
# # With php-fpm (or other unix sockets):
# fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
# # With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /.ht {
# deny all;
#}
}
# Flask应用
server {
# listen 80 default_server;
# listen [::]:80 default_server ipv6only=on;
listen 8001; # 监听端口,http默认80
# root /usr/share/nginx/html;
root /home/flask_demo/ENV_flask; # flask项目根路径
# index index.html index.htm;
# Make site accessible from http://localhost/
# server_name localhost;
server_name 192.168.75.138; # 公网ip或已解析ip的域名
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# try_files $uri $uri/ =404;
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules
include uwsgi_params; # 使用nginx内置的uwsgi配置参数文件
uwsgi_pass 127.0.0.1:8001; # 转发请求到该地址端口
uwsgi_param UWSGI_SCRIPT main:app; # 调用的脚本名称和application变量名
}
}
# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
# listen 80;
# listen [::]:80;
#
# server_name example.com;
#
# root /var/www/example.com;
# index index.html;
#
# location / {
# try_files $uri $uri/ =404;
# }
#}
保存退出
4.重新启动Nginx服务
命令如下:
代码语言:javascript复制sudo service nginx restart
5.最后回到虚拟环境(项目根目录)下,启动uwsgi服务
命令如下:
代码语言:javascript复制cd home/flask_demo/ENV_flask/
uwsgi --ini flask_uwsgi.ini
6.效果展示
通过宿主机浏览器,访问服务器IP:8001,就可以看到效果啦
可能遇到的问题
启动uwsgi服务时发现端口被占用
probably another instance of uWSGI is running on the same address (:xxxx).
可以使用如下命令关停该端口:
代码语言:javascript复制sudo fuser -k Port/tcp
例如:关停8001端口:sudo fuser -k 8001/tcp
再重新启动uwsgi服务就可以了
后记
如果想要利用Nginx部署多个服务,直接在default
配置文件中添加server
项即可。
参考资料: ubuntu nginx uwsgi flask的安装和配置_ReeseIMK的博客-CSDN博客 Flask uwsgi Nginx的简易搭建(ubuntu)_Yvettre的博客-CSDN博客