python web部署

news/2024/7/8 1:50:19

为什么80%的码农都做不了架构师?>>>   hot3.png

nginx + gunicorn + flask + supervisor的搭建

为什么要加nginx。

Nginx能更好地直接处理静态资源(通过一些http request header),而把动态资源转发给后端服务器

Nginx也可以缓存一些动态内容

Nginx可以进行多台机器的负载均衡

Nginx可以更方便的实施一些安全策略。gunicorn 直接暴露还是蛮危险的,nginx挡一层,过滤掉一些恶意IP,同样的gunicorn处理起来就比较麻烦了。

nginx常见的两种代理方式:

 

正向代理:{ 客户端 ---》 代理服务器 } ---》 服务器

反向代理:客户端 ---》 { 代理服务器 ---》 服务器 }

{} 表示局域网

gunicorn:

flask自带的app.run()服务,稳定性等各方面都不足,只适用于测试环境,线上环境还是要有专门的服务器,gunicorn和uWsgi就是常用的两个解决方案。

guincorn是支持wsgi协议的http server,gevent只是它支持的模式之一 ,是为了解决django、flask这些web框架自带wsgi server性能低下的问题。

supervisor:

Linux的后台进程运行有好几种方法,例如nohup,screen等,但是,如果是一个服务程序,要可靠地在后台运行,我们就需要把它做成daemon,最好还能监控进程状态,在意外结束时能自动重启。

supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。

 

网络架构:


114258_Sxu6_1384334.png

 

环境:

Ubuntu 15.10

1. 安装pip和virtualenv

rot@rot-virtual-machine:~$ sudo apt-get install python-pip python-vitualenv

2. 创建独立环境。

# home目录下的操作就不用sudo了

rot@rot-virtual-machine:~$ cd ~  #必须到用户目录,否则在以后的安装gunicorn会由于权限问题失败
rot@rot-virtual-machine:~$ sudo mkdir -p pythonapp/dffyb
rot@rot-virtual-machine:~$ cd pythonapp/dffyb
rot@rot-virtual-machine:~/pythonapp/dffyb$ vitualenv venv
rot@rot-virtual-machine:~/pythonapp/dffyb$ source venv/bin/activate  # 使用虚拟环境,看下一步linux提示符的变化,开头多了一个(venv)

(venv)rot@rot-virtual-machine:~/pythonapp/dffyb$ pip install flask
(venv)rot@rot-virtual-machine:~/pythonapp/dffyb$ pip install gunicorn  #安装成功后,进入venv/bin/目录,会有一个gunicorn文件,否则安装失败。

(venv)rot@rot-virtual-machine:~/pythonapp/dffyb$ deactivate #退出venv环境

rot@rot-virtual-machine:~/pythonapp/dffyb$ vim runserver.py  #创建一个flask引入文件

#!/usr/bin/python                                                                                                                                                                                       
from flask import Flask
 
app = Flask(__name__)

@app.route('/')
def hello():
   return "hello world"
   
if __name__ == '__main__':
     app.run(debug = True)

3. 配置gunicorn。

rot@rot-virtual-machine:~/pythonapp/dffyb/venv$ vim gunicorn.conf

workers = 3  # 服务器内核数                                                                     
bind = '127.0.0.1:8000'  # gunicorn开启的服务地址和端口,默认8000

4. 配置supervisor。

rot@rot-virtual-machine:~$ sudo apt-get install supervisor

rot@rot-virtual-machine:~$ whereis supervisor
supervisor: /etc/supervisor
rot@rot-virtual-machine:~$ cd /etc/supervisor
rot@rot-virtual-machine:~/etc/supervisor$ cd conf.d
rot@rot-virtual-machine:~/etc/supervisor/conf.d$ sudo vim dffyb.conf

[program:dffyb]     #进程唯一名称,操作进程时候用                                                                                                                                                          
command=/home/rot/pythonapp/dffyb/venv/bin/gunicorn runserver:app -c /home/rot/pythonapp/dffyb/venv/gunicorn.conf  # 创建进程的命令
directory=/home/rot/pythonapp/dffyb  # 创建进程时的所在目录
user=www #所属用户
autostart=true #自动开启
autorestart=true #自动重启
stdout_logfile=/var/log/supervisor/gunicorn_supervisor.log
stderr_logfile=/var/log/supervisor/gunicorn_supervisor.err

rot@rot-virtual-machine:~$ sudo supervisorctl reread  # 重新读取配置文件

rot@rot-virtual-machine:~$ sudo supervisorctl update # 更新配置文件

rot@rot-virtual-machine:~$ sudo supervisorctl start dffyb # 启动 gunicorn

rot@rot-virtual-machine:~$ sudo supervisorctl stop dffyb # 停止 gunicorn

rot@rot-virtual-machine:~$ sudo supervisorctl status # 查看状态

rot@rot-virtual-machine:~$ curl   # 如果返回hello world,说明服务成功开启

command=/home/rot/pythonapp/dffyb/venv/bin/gunicorn runserver:app -c /home/rot/pythonapp/dffyb/venv/gunicorn.conf  # 解释

/home/rot/pythonapp/dffyb/venv/bin/gunicorn  #  gunicorn 安装路径

runserver:app  # 跑的文件名,runserver.py  , app  runserver.py  中创建的app变量名,其实runserver.py中的app.run()可以不要,在这里会自动执行。

centos下

[root@www web] vim /etc/supervisord.conf
#添加

[program:ny108]
command=/data/www/p_ny108com/venv/bin/gunicorn runserver:app -c /data/www/p_ny108com/venv/gunicorn.conf
directory=/data/www/p_ny108com
user=www
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/gunicorn_supervisor.log
stderr_logfile=/var/log/supervisor/gunicorn_supervisor.err


[root@www web] supervisord -c /etc/supervisord.conf

5. nginx配置。

rot@rot-virtual-machine:~$ sudo apt-get install nginx
rot@rot-virtual-machine:~$ sudo cp /etc/nginx/sites-available/default dffyb.conf 
rot@rot-virtual-machine:~$ sudo vim /etc/nginx/sites-available/dffyb.conf

server {  
    listen   80;  
    server_name dffyb.com;  
      
    root /home/rot/pythonapp/dffyb;  
    access_log /home/rot/logs/access.log;  
    error_log /home/rot/logs/error.log;  
  
    location / {  
        proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;  
        proxy_set_header Host $http_host;  
        proxy_redirect off;  
        if (!-f $request_filename) {  
            proxy_pass http://127.0.0.1:8000;  
            break;  
        }  
    }  
}  

rot@rot-virtual-machine:~$ sudo nginx -t # 测试一下配置文件
rot@rot-virtual-machine:~$ sudo service nginx start
rot@rot-virtual-machine:~$ sudo nginx -s reload # 平滑重启
rot@rot-virtual-machine:~$ curl   # hello world 就成功了、

 

 

转载于:https://my.oschina.net/shyl/blog/667470


http://www.niftyadmin.cn/n/1903684.html

相关文章

Android各种屏幕适配原理

dip(dp): device independent pixels(设备独立像素) dip,就是把屏幕的高分成480分,宽分成320分。比如你做一条160dip的横线,无论你在320还480的模拟器上,都是一半屏的长度。 dpi:dot per inch dpi&#xff…

Microsoft Dynamics CRM 2013 试用之系统篇 Windows Server 2012 R2安装

Microsoft Dynamics CRM 2013要求Windows Server 2008 R2以上,本人就装最新的Windows Server 2012 R2 测试。 系统安装很简单,直接下载原版iso载入虚拟机运行即可以。 以下为一般步骤: 选第二个,选第一个的话,就变成DO…

Nuttx实时操作系统 SAMV71-Xplained开发板适配

官网参考: https://nuttx.apache.org/docs/latest/quickstart/compiling.html 1、board配置 nhfnhf-VirtualBox:~/work/learn/nuttx/NUTTX/nuttx$ ./tools/configure.sh -L | grep samv71samv71-xult:nshsamv71-xult:netnshsamv71-xult:vncsamv71-xult:modulesamv…

集合框架(ListIterator的特有功能)

ListIterator接口的成员方法boolean hasPrevious()E previous()package cn.itcast_04;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.ListIterator;/** 列表迭代器:* ListIterator listIterator():Lis…

Ubuntu搭建TFTP服务器

1、需要安装 tftp-hpa 和 tftpd-hpa sudo apt-get install tftp-hpa tftpd-hpa sudo apt-get install xinetd2、创建TFTP服务器文件目录 mkdir /home/nhf/work/tftp可以把文件放入该目录进行文件传输 3、配置 tftp 新建文件/etc/xinetd.d/tftp,并添加内容server…

When Cyber Security Meets Machine Learning 机器学习 安全分析 对于安全领域的总结很有用 看未来演进方向...

链接:http://ucys.ugr.es/jnic2016/docs/MachineLearning_LiorRokachJNIC2016.pdf https://people.eecs.berkeley.edu/~adj/publications/paper-files/SecML-MLJ2010.pdf 一些关键点: 算了,不总结了。

vscode 配置代码格式化工具calng-format,windows/linux都支持

1、安装clang-format工具 linux (ubuntu) sudo apt-get install clang-format-11windows 下载clang-format.exe,并将此文件路径加入环境变量 下载地址或从官网: https://download.csdn.net/download/niu_88/14946310 本人安装是clang-format 11版本&…

ListView+CheckBox实现全选 单击效果

在网上也找了一些案例,但都是用Map来实现的.我的是把对象绑定到当前控件上.代码稍微简洁. main布局文件:main.xml <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android&quo…