Flask 、Nginx 和uWSGI搭建记录

简介

  • Flask是web框架。
  • Nginx是代理服务器,当访问过大,单个服务器不能满足需要多个服务器(分布式服务器),Nginx可以来分配客户端请求和web服务器(像个管家)。
    Nginx优点:
    负载均衡:根据请求情况和服务器负载情况,将请求分配给不同的web服务器,保证服务器性能。负载均衡的机制有3种:
    (1) 循环 - 对应用程序服务器的请求以循环方式分发,
    (2) 最少连接 - 下一个请求被分配给活动连接数最少的服务器,
    (3) ip-hash - 哈希函数用于确定应为下一个请求选择哪个服务器(基于客户端的IP地址)。
    反向代理:客户端的请求由代理服务器分配给某web服务器,而不是客户端指定的目标服务器。对于一些静态文件,可以直接由反向代理处理,不经过web服务器。
    安全性:客户端无法得知真正的服务器IP地址,保证了服务器的安全

在这里插入图片描述

  • WSGI只是一个协议,只要web服务器和web框架满足WSGI协议,它们就能互相搭配。
  • uWSGI是实现WSGI协议的一个web服务器,即接受客户端请求,转发想阴的程序。

正向代理:例如:VPN 就是做正向代理的。正向代理服务器位于客户端和服务器之间,为了向服务器获取数据,客户端要向代理服务器发送一个请求,并指定目标服务器,代理服务器将目标服务器返回的数据转交给客户端。这时,客户端和代理服务器可以看做一个客户端整体向目标服务器发送请求,所以客户端需要设置一些正向代理的配置。此时,目标服务器并不知道是谁真正想要请求这些数据的。

反向代理:其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器整体,暴露的是代理服务器地址,隐藏了真实服务器IP地址。客户端并不知道真正的服务器是谁。


服务器搭建

创建并进入项目文件夹

mkdir ~/myproject
cd ~/myproject

安装virtualenv,创建并激活虚拟环境。

sudo pip install virtualenv
virtualenv myprojectenv
source myprojectenv/bin/activate

默认创建python2.7版本,可使用例:virtualenv -p /usr/bin/python3 env1指定python版本,需自己提前安装好。

安装uwsgi和flask:

pip install uwsgi 
pip install flask

如果安装uwsgi出现一大片红色报错:ERROR: Command errored out with exit status 1: … 可能是gcc版本问题。

将gcc从7.5切换到4.8。

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 100

pip install uwsgi

创建APP

nano ~/myproject/myproject.py
from flask import Flask      
app = Flask(__name__)      

@app.route("/")    
def hello():
    return "<h1 style='color:blue'>Hello There!</h1>"

if __name__ == "__main__":
    app.run()

导入Flask模块, Flask类的一个对象是我们的WSGI应用程序。
Flask构造函数使用当前模块(__name __)的名称作为参数。
Flask类的route()函数是一个装饰器,它告诉应用程序哪个URL应该调用相关的函数。

app.route(rule, options)
  • rule 参数表示与该函数的URL绑定。
  • options 是要转发给基础Rule对象的参数列表。

在上面的示例中,’/ ’ URL与hello_world()函数绑定。因此,当在浏览器中打开web服务器的主页时,将呈现该函数的输出。

app.run(host, port, debug, options)
  • hsot:要监听的主机名。 默认为127.0.0.1(localhost)。设置为“0.0.0.0”以使
    服务器在外部可用
  • port:默认值为5000
  • debug:默认为false。 如果设置为true,则提供调试信息
  • options:要转发到底层的Werkzeug服务器

编写uwsgi配置

nano ~/myproject/wsgi.py
from myproject import app

if __name__ == "__main__":
    app.run()
nano ~/myproject/myproject.ini
[uwsgi]
module = wsgi:app  # 指明了要启动的模块,wsgi 就是项目启动文件 wsgi.py 去掉扩展名,app 是 wsgi.py 文件中的变量 app,即 Flask 实例。

master = true  # 启动主进程,来管理其他进程,其它的uwsgi进程都是这个master进程的子进程
processes = 5  # 表示启动的服务占用5个进程
logto=/home/well/myproject/uwsgi.log

socket = myproject.sock   # 指定socket文件,uwsgi的监听端口  
chmod-socket = 666  # 权限
vacuum = true  # 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件

# 请求超时300秒
socket-timeout = 300
http-timeout = 300

die-on-term = true

创建systemctl服务

sudo nano /etc/systemd/system/myproject.service
[Unit]
Description=uWSGI instance to serve myproject
After=network.target

[Service]
User=root
Group=www-data
WorkingDirectory=/home/well/myproject
Environment="PATH=/home/well/myproject/myprojectenv/bin"
ExecStart=/home/well/myproject/myprojectenv/bin/uwsgi --ini myproject.ini

[Install]
WantedBy=multi-user.target

启动服务

sudo  systemctl start myproject
sudo systemctl enable myproject

nginx

安装并启动nginx。

sudo apt-get update
sudo apt-get install python3-pip python3-dev nginx
sudo service nginx start

在浏览器中访问:http://0.0.0.0/ 可以看下面界面这表示安装启动成功。
在这里插入图片描述

编写nginx配置:

sudo nano /etc/nginx/sites-available/myproject
server {
    listen 80;
    server_name localhost;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:///home/well/myproject/myproject.sock;
        uwsgi_read_timeout 600;
    }
}
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx

在这里插入图片描述

删除默认nginx配置:

cd  /etc/nginx/sites-enabled 
ls

显示 :default myporject myproject mysite.conf

rm default

查看nginx错误日志:

cat /var/log/nginx/error.log

查看uswgi错误日志:

sudo cat myproject/uwsgi.log

查看nginx状态:

service nginx status

在这里插入图片描述

查看myproject状态:

service myproject status

在这里插入图片描述

每次修改myproject.py文件后都要重新启动项目:

service myproject restart

解决跨域

app = Flask(__name__)

def after_request(response):
    response.headers['Access-Control-Allow-Origin'] = '*'
    response.headers['Access-Control-Allow-Methods'] = 'PUT,GET,POST,DELETE'
    response.headers['Access-Control-Allow-Headers'] = 'Content-Type,Authorization'
    response.headers['X-Content-Type-Options'] = 'nosniff'
    return response

app.after_request(after_request)

Blueprint

项目结构:
———— main.py

———— applications

————————app.py
main.py

import sys
sys.path.append('applications')

from app import app_name

app = Flask(__name__)
app.register_blueprint(app_name,url_prefix='/app_name')  # 注册蓝图,url_prefix是前缀的意思。

app.py

from flask import Blueprint

app_name = Blueprint('app_name', __name__)  # 创建蓝图

@app_name.route('/')
def hello():
	return 'hello blueprint'

访问:

localhost/app_name/

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值