前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx+uWSGI+Flask部署至Ubuntu

Nginx+uWSGI+Flask部署至Ubuntu

作者头像
花猪
发布2022-02-23 13:29:29
1.6K2
发布2022-02-23 13:29:29
举报

前言

最近在学习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博客

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 正文
    • 项目环境搭建
      • uwsgi
        • Nginx
          • 可能遇到的问题
            • 启动uwsgi服务时发现端口被占用
        • 后记
        相关产品与服务
        专用宿主机
        专用宿主机(CVM Dedicated Host,CDH)提供用户独享的物理服务器资源,满足您资源独享、资源物理隔离、安全、合规需求。专用宿主机搭载了腾讯云虚拟化系统,购买之后,您可在其上灵活创建、管理多个自定义规格的云服务器实例,自主规划物理资源的使用。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档