python进阶Flask 踩坑FLASK入门

小白系列之Flask服务器部署

2019-05-10  本文已影响26人  君莫舞丶无念

准备将自己所学的Flask道路中遇到的一系列的坑弄成一个新专题跟大家一起分享。当然自己还是小白一个,如有不当的地方,可以私信一起讨论一下啦。

想来想去最后还是准备从Flask服务器部署开始写起,我将以我自己做博客网站的经历用通俗易懂的语言跟大家分享经验,开始喽。

一、host设置方式使服务器上的网页可被外部访问

大家还记得flask run命令吧,通常运行后,就可以在本地127.0.0.1:5000访问自己做的网页了。


flask run

想象一下,如果代码是在服务器上,那么输入这一行代码后,只能在服务器黑窗口上打开浏览器并访问127.0.0.1:5000,然后对着黑窗口一脸懵逼的自行脑补自己做的网页的样子。。。


46c5d58fad7af527.jpg
所以当然有需求就有解决的办法啦,在网上查阅一番后,总结了下面两种方法。

直接输入flask run -p 5000 -h 0.0.0.0

将文件中的代码app.run()改为app.run(host='0.0.0.0',port=5000)

其实两种方法功能是一样的,只是这个port和host是什么意思呢。

port就是端口的意思,可以把端口看成是访问服务器地址的入口,同一个服务当然只能占用一个入口啦,就相当于不同的房间有不同的门。
而hosts是一个没有扩展名的系统文件,它并不是软件或者工具,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”。简单的理解就是0.0.0.0设置以后,你的服务器IP地址就能被外网访问了,因此,此时你在自己的电脑上访问服务器的ip地址就相当于当初在本地127.0.0.1:5000访问自己的网页一样了。o(∩_∩)o 是不是很简单呢。

但是我自己的服务器是阿里云的服务器,进行以上设置之后就会出现:


image.png

脑壳痛!这个地方我可是弄了很久,而且阿里云自带的教程文档被藏在网站的各个角落里,找了很久才能找到。。。其实可以仔细想一下,既然原理没有差错,那可能就是端口的问题,要么是端口被占用,要么是端口没开放,最终发现阿里云控制台有个端口开放的界面。

此处借用网友的一张图

原来阿里云的服务器端口需要自己手动开启。这样第一项尝试就大功告成了!

二、设置uWSGI

当你觉得第一种设置的方式可以让你的服务器配置成功就是大错特错了。你会发现,只要你将用ssh连接服务器的xshell关闭之后,你的网页就无法再访问。
其实想一下就能想通,平常自己的命令函窗口关闭之后,在本地也是无法访问自己网站了的,虽说linux服务器在远程一直开着的,但是关闭xshell时就好比关闭了命令窗口,就无法启动了,因此这里就需要使用第二种方法了。uWSGI的配置方法。


难受

这个时候的你应该打开搜索引擎去搜索一下什么是uWSGI以及一些相关资料(这是非常好的学习习惯呢,会受益很多)就会发现有着uWSGI+Nginx之类的词汇。

我们先来说uWSGI。uWSGI是一个web服务器,可能有朋友听说过服务器apache/tomcat之类的词汇,其实apache/tomcat是tcp/ip协议进行通信的,uWSGI与之不同之处在于它可以提供独特的uwsgi协议进行通信,这里的协议不得弄得朋友可以查阅一下资料,当然我以后的文章也会说到的,不要错过哦。
先执行:

pip install uwsgi

接下来进行配置,先是在你想存放的任何位置执行下面命令

touch uconfig.ini #创建一个uconfig.ini配置文件
vi uconfig.ini #读取uconfig.ini文件

关于vi/vim以后我一会写一期教程的,现在可以把他看为一个文本编辑器,只不过有点奇怪,需要特定的命令。

按下a ,开始写入文件
写下配置文件:
[uwsgi]
socket = 0.0.0.0:5002 #阿里云服务器中,要将5002端口添加到安全组中# 外部访问地址,可以指定多种协议,此处使用socket。
chdir = /home/pythonproject/my_flask/py3env/myblog/ # 指向项目目录
wsgi-file = /home/microblogpw/microblog.py #这里是flask启动程序文件,此处切忌填错py文件的名称,或者是app不在if之下,否则报错:no python application found, check your startup logs for errors 无法找到你的app实例
callable = app # flask在microblog.py文件中的app名
processes = 4 # 处理器数
threads = 2 # 线程数
stats = 127.0.0.1:9191 #状态检测地址
touch-reload=/home/microblogpw/ #动态监控文件变化,然后重载服务,是跟uWSGI的emperor有关的配置项,当这个路径下面的文件发生变化,服务就会重新加载,这在部署上线之后对项目内容进行修改的时候十分有用
daemonize = /home/wyz/flask/server.log #daemonize项的出现表示把uwsgi服务器作为后台进程启动,项的值指向一个文件表明后台中的所有输出都重定向到这个日志中去。

上面的#后面是注释,这里给一个简洁版本的配置,记住要把自己的实际的文件路径配置上去哦。

[uwsgi]
socket = 0.0.0.0:5002
chdir = /home/pythonproject/my_flask/py3env/myblog/
wsgi-file = /home/microblogpw/microblog.py
callable = app
processes = 4
threads = 2
stats = 127.0.0.1:9191
touch-reload=/home/microblogpw/
daemonize = /home/wyz/flask/server.log

配置好之后就可以使用命令行工具启动uWSGI服务器:

uwsgi --ini /home/uconfig.ini

也可以直接使用

uwsgi uconfig.ini

当然还要记住停止uwsgi的命令(因为时常报错的内容就是uwsgi已启动,这个时候将uwsgi停止后再启动)

pkill -f -9 uwsgi

好了这个时候已经配置好了,你现在可以在自己的电脑上访问服务器上的网页了,即使是自己关闭xshell也毫无问题。
既然已经配置完成了,那么这个nginx又有什么用呢?

三、配置nginx

nginx其实起的是一个反代理的作用,nginx的反向代理指向uWSGI的ip和端口,这样使得网页更加的安全可靠。

接下来安装并配置nginx

sudo yum install nginx #安装文件

nginx常用命令:
  nginx  启动nginx
  nginx -s stop/reload  停止nginx/重载配置文件
  nginx -v  查看版本
  nginx -t  测试配置文件是否有语法上的错误等
killall -9 nginx 杀死进程,端口被占用的时候使用

默认的配置文件位置在/etc/nginx/nginx.conf
进入根目录后使用vi nginx.conf开始配置文件
找到下面文字的相应位置进行修改

server {

    listen       80;         //默认的web访问端口

    server_name  xxxxxx;     //服务器名

    #charset koi8-r;

    access_log  /home/wyz/flask/logs/access.log;    //服务器接收的请求日志,logs目录若不存在需要创建,否则nginx报错
    
    error_log  /home/wyz/flask/logs/error.log;         //错误日志

    location / {

        include        uwsgi_params;     //这里是导入的uwsgi配置

        uwsgi_pass     127.0.0.1:5051;   //需要和uwsgi的配置文件里socket项的地址
                                         //相同,否则无法让uwsgi接收到请求。

        uwsgi_param UWSGI_CHDIR  /home/wyz/flask;     //项目根目录

        uwsgi_param UWSGI_SCRIPT manage:app;     //启动项目的主程序(在本地上运行
                                                 //这个主程序可以在flask内置的
                                                 //服务器上访问你的项目)

 }

}

终于,最后完成如此配置后即完成。

四、总结

其中uwsgi进行配置的时候,我一开始使用的是http,最后查阅文档后发现还是需要socket。这其实是一个Nginx和uWSGI之间配置协同的一个问题。如果uWSGI直接通过HTTP方式对外提供服务,那么nginx中需要配置proxy_pass,指出HTTP服务具体套接字,从而实现请求的转发。


image.png

而如果将uWSGI配置为socket,通过socket对外提供服务(由于socket不涉及具体的协议,外部没法直接通过uWSGI端口访问服务也更加安全一些。比如可以在nginx中配置一些URL的拒接防止sql注入之类的),那么nginx配置就应该得是uwsgi_pass来实现请求的转发。 proxy_pass配置的时候写http://,即表示是走http协议的;uwsgi_pass的时候未指出协议,表示走socket。


image.png

我所定义的为uwsgi_pass,因此,uwsgi中应该定义socket地址,如果定义proxy_pass的时候写http://则uwsgi中应该定义http地址。
(以上如有问题,不吝赐教,真心希望你的批评指正。)

欢迎大家关注我的微信公众号,我会不定期的发布更多有关知识的一个干货分享,喜欢的小伙伴支持一下吧。


君莫舞丶无念blog
上一篇下一篇

猜你喜欢

热点阅读