最近使用flask写了一些简单的服务。

服务部署到服务器上进行使用,这个过程会有一些问题,需要进行记录一下。

说明运行的环境情况。使用的是python3.6的虚拟环境,系统是centos7,其他的有uwsgi,supervisor,ngnix。

首先准备一个简单的flask服务。

代码ipapp.py:

# encoding=utf-8
# date: 2019/3/5
__author__ = "Masako" from flask import Flask app = Flask(__name__) @app.route('/')
def index():
return "<p>my ip: 37.221.204.206</p>" if __name__ == "__main__":
app.run()

一、安装python3.6

  1.下载

   # wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz 

  2.解压

    # tar -zxvf Python-3.6..tgz

  3.到解压好的文件夹先配置

    # cd Python-3.6.

    # ./configure

    *遇到问题

    

     安装gcc

   # yum install -y gcc

    再配置,成功。

  4.继续编译及安装

   # make && make install

  5.创建虚拟环境

      我的工作文件夹为 /root/ip_tool, 在这里执行命令

   # virtualenv -p /usr/local/bin/python3 ip_env

      创建的是自己安装的python3的虚拟环境

       然后在虚拟环境安装一些需要的python库,如flask等

二、安装并配置uwsgi

  uwsgi是服务器的一种,主要用来跑你的服务

  1.安装

    在虚拟环境执行

     # pip install uwsgi

  2.测试uwsgi

    使用uwsgi启动一下我的flask服务

     ------

      为了方便,先装了一个screen

       # yum install screen

       然后在screen内测试uwsgi

    ------

      简单启动我的ipapp.py

# uwsgi --http 127.0.0.1: --wsgi-file ipapp.py --callable app

     由于在screen内运行的uwsgi,所以退到screen外部执行

  # curl http://127.0.0.1:5000

     验证得到下图

  3.配置文件

   把uwsgi的参数写到文件里面,保存为test_uwsgi.ini

[uwsgi]
base = /root/ip_pool
http = 127.0.0.1:
wsgi-file = ipapp.py
callable = app

    再使用文件打开服务,注意在虚拟环境

        # uwsgi --ini test_uwsgi.ini

        结果与使用uwsgi命令运行服务相同

如果使用uwsgi打开服务有问题,可能是uwsgi路径或者配置相关问题,需要找到对应方案解决

三、安装并配置nginx

  nginx是一个代理服务器。

        1.安装

     # yum install nginx 

   *出现问题 No package nginx available.

         安装一下源

     # yum install epel-release

       再执行上一条命令,成功

   2.测试

     打开nginx

     # /bin/systemctl start nginx.service

    在别的地方输入服务器的地址,或者curl,可以看到 "Welcome to nginx" 之类的字样

3.配置

    先到nginx安装的文件夹,如/etc/nginx/,有可能是其他的,可以自己找一下

      # cd /etc/nginx/

      编辑 "nginx.conf"

      如果有一些配置文件,可以都放在一个文件夹中,如"conf.d",然后在配置中包含这个文件夹,即在nginx.conf的末尾加上

      include /etc/nginx/conf.d/*.conf;

     在这里,我简单配置,直接修改nginx.conf

     找到“location /”,将大括号里的内容修改如下

location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:;
uwsgi_param UWSGI_PYHOME /root/ip_pool/ip_env/bin/python;
uwsgi_param UWSGI_CHDIR /root/ip_pool;
uwsgi_param UWSGI_SCRIPT ipapp:app;
}

    此时,我的ipapp.py放在文件夹“/root/ip_pool”中,并有虚拟环境ip_env,启动文件为ipapp.py, 应用名为app。

    我们再修改一下uwsgi的配置,

[uwsgi]
base = /root/ip_pool
# http = 127.0.0.1:5000
socket = 127.0.0.1:10050
wsgi-file = ipapp.py
callable = app

    可以看到,将http更换成了socket,并且保持地址与nginx中配置的 uwsgi_pass 一致。

    我们重启nginx  /bin/systemctl reload nginx.service

      在虚拟环境启uwsgi服务

    

  4.再测试

    在另一个地方(另一台机器)输入我的IP地址,得到我写的网页

    

    *如果访问不起,检查一下端口防火墙之类的。

    到此,服务就部署可用了。

四、安装并使用supervisor

  supervisor主要用来管理进程,这里使用其管理uwsgi程序。

  1.安装,使用机器环境

    # yum install supervisor

   生成配置文件

    # echo_supervisord_conf > /etc/supervisord.conf

  启动supervisor服务

     # supervisord -c /etc/supervisord.conf

  查看状态

    # supervisorctl status

   *出现 unix:///tmp/supervisor.sock no such file , 创建文件后出现 unix:///tmp/supervisor.sock refused connection,可能是服务没有启动

  2.配置

   配置配置文件,在 "/etc/supervisord.conf"文件中,取消注释"[include]",增加自己的配置文件夹,这里我使用supervisord.d

    即在"/etc/supervisord.conf"增加以下2行内容

[include]
files = supervisord.d/*.conf

    *.conf是我自己的文件后缀,默认是.ini

   配置自己的项目,编辑我自己的项目配置,配置如下

[program:ip]
directory=/root/ip_pool
command=/root/ip_pool/ip_env/bin/uwsgi --ini test_uwsgi.ini
autostart=true
user=root
stderr_logfile=/tmp/ip_stderr.log
stdout_logfile=/tmp/ip_stdout.log

  这个文件放在/etc/supervisord.d里面即可,名字随便取一个,后缀为.conf

  重启supervisorctl,这个任务就跑起来了

  

  如果跑不起来,端口占用,可能是之前的uwsgi任务没有关。

  这个时候再次访问服务器ip地址,得到的结果与之前相同。也就是supervisor只是用来跑这个程序的辅助工具。

总结

  使用uwsgi + nginx 配置服务,加上supervisor管理,需要的流程比较长,配置的文件比较多。

   需要耐心处理,遇到问题,多看提示,不会的搜索一下,很多人会遇到同样的问题。

  总的来说,除了安装必要的环境,需要修改或增加的文件有以下几个:

    1.nginx,修改nginx.conf,配置路由、接口

    2.uwsgi,增加uwsgi.ini,也可以不增加,直接执行命令,跑flask应用

    3.supervisor,增加myapp.conf,配置我的uwsgi的参数

    4.supervisor,修改supervisord.conf,增加包含自己编辑的配置文件路径,以使supervisor找到配置文件并启动程序

  后续再同一台机器上配置其他服务时,只需要修改路由,增加两个配置文件(supervisor和uwsgi),文件大致相同,修改端口和需要执行的命令即可。

  如果涉及到更加复杂的服务,可以丰富一下配置文件,根据需求,增加配置参数。

参考文章链接:

  http://docs.jinkan.org/docs/flask/

  http://www.supervisord.org/introduction.html

  http://www.runoob.com/django/django-nginx-uwsgi.html

  https://www.cnblogs.com/liubiao/p/6689081.html

  https://www.cnblogs.com/if-then/p/7259865.html

  https://www.cnblogs.com/alice-bj/articles/9298177.html

  

  

最新文章

  1. ListMultimap 容器
  2. Windows程序设再读笔记00-序言
  3. java 泛型的几点备忘
  4. Bootstrap &lt;第一篇&gt;
  5. Mysql 的存储过程和存储函数
  6. 修改UISearchBar背景色
  7. SWT的GridData一些参数的图示
  8. Java的JDBC原生态学习以及连接池的用法
  9. icpc南宁站赛后总结
  10. Xcode - Xcode10上传应用到AppStore
  11. 【强化学习】python 实现 q-learning 例一
  12. Python向来以慢著称,为啥Instagram却唯独钟爱它?
  13. Selenium:注解@FindBy、@FindBys、@FindAll的用法
  14. (20)jQuery的文档操作(创建,添加、设置样式和删除等)
  15. 【RL系列】MDP与DP问题
  16. Linux下编译Phantomjs
  17. 【洛谷】2474:[SCOI2008]天平【差分约束系统】
  18. 关闭Spring Boot的Jsckson的FAIL_ON_EMPTY_BEANS
  19. cudaMalloc和cudaMallocPitch
  20. Java泛型通配符以及限定

热门文章

  1. 从Objective-C到Swift,你必须会的(二)组合options
  2. Centos 7 安装记录
  3. WinRT支持GB2312
  4. Windows和linux通过命令互传文件
  5. ubuntu 16.04.1 nginx彻底删除与重新安装
  6. 自己从0开始学习Unity的笔记 VI (C#的for循环练习)
  7. 企业IT架构转型之道 读书笔记-1.阿里巴巴集团中台战略引发的思考
  8. 开发者常用的十款Chrome插件
  9. php函数源代码 C编写 【持续更新】
  10. bzoj3435 [Wc2014]紫荆花之恋(动态点分治+替罪羊树)