nginx可作为HTTP服务器、反向代理服务器、邮件服务器。可用来实现反向代理、负载均衡。
正向代理与反向代理区分:
正向代理:访问gg,这就是正向代理,代理了客户端。
反向代理:某个服务有3台服务器,对这3台服务器做一个统一的管理,就是反向代理,代理了服务端。以代理服务器来接收请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端
Socket:计算机之间进行通信的一种约定或一种方式,利用三元组【ip地址,协议,端口】进行网络间通信。Socket通信的数据传输方式,常用的有两种:
a、SOCK_STREAM:表示面向连接的数据传输方式。数据可以准确无误地到达另一台计算机,如果损坏或丢失,可以重新发送,但效率相对较慢。常见的 http 协议就使用 SOCK_STREAM 传输数据,因为要确保数据的正确性,否则网页不能正常解析。
b、SOCK_DGRAM:表示无连接的数据传输方式。计算机只管传输数据,不作数据校验,如果数据在传输中损坏,或者没有到达另一台计算机,是没有办法补救的。也就是说,数据错了就错了,无法重传。因为 SOCK_DGRAM 所做的校验工作少,所以效率比 SOCK_STREAM 高。
我用到的nginx是作为反向代理,监听容器内部端口。整体流程为:
客户端—>服务端端口—>Docker映射内部端口—>nginx监听—>将请求传递给uwsgi服务—>flask框架下的server处理任务
1、docker 实现容器内外端口映射,起容器时配置端口
docker XXX 外部端口:内部端口 XXX
2、nginx 监听本地端口
用一个*.conf文件来实现监听,并把服务传递uwsgi,启动服务时需要在容器内将nginx启动。启动方式为运行 nginx即可。
*.conf文件示例:
- server {
- listen 80; #监听容器内80端口
- server_name app1.mydomain.com; #配置域名,不重要,可以写成localhost
- error_log /home/workspace/error.log # 服务错误日志
- access_log /home/workspace/access.log # 接收请求日志
- location / { # 接收请求,可用正则过滤
- include uwsgi_params;
- uwsgi_pass 127.0.0.1:9090; #把所有nginx接收到的请求传给本地9090的uwsgi协议处理
- uwsgi_param UWSGI_PYHOME /var/www/myenv;
- uwsgi_param UWSGI_SCRIPT myapp1; #也可以是参数server:app或run:app等,似乎指服务类型
- uwsgi_param UWSGI_CHDIR /var/www/myappdir1; #项目根目录
- }
- }
3、uwsgi服务
uwsgi将nginx监听到的任务交给Flask框架处理。
区分以下3个概念:
WSGI,全称 Web Server Gateway Interface, Gateway就是网关, Web 服务器(server)和 Web 应用程序或框架(app、Flask)之间的一种简单而通用的接口,是一种通信的规范(通信协议),作用是在协议之间进行转换。
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。
uwsgi是一个uWSGI服务器自有的协议。
将uwsgi启动命令转化为一个ini配置文件,启动时运行uwsgi uwsgi.ini
常用参数:
[uwsgi]
socket = 127.0.0.1:3031 # 通信ip、port配置,需要和nginx的.conf文件中的uwsgi_pass 保持一致
chdir = /home/foobar/myproject/. #指定项目的目录
wsgi-file = myproject/server.py # 服务文件路径
processes = 4 # 进程数
threads = 2 # 线程数
4、flask框架服务
常用命令
from flask import Flask
app=Flask(__name__) #引入了Flask包,并创建了一个web应用的实例“app”,__name__是系统变量,实例名称就是这个python的文件名
@app.route('/') # 用了装饰器,指明了路由规则
def hello_world():
return __name__
app.run() # 程序实例用run方法启动flask集成的开发web服务器
app.run(host='0.0.0.0',port=8888,debug=True) #为支持远端访问,设置host参数及端口号。debug是设置了调试模式
@app.before_first_request #在接收请求前执行一次,比如模型的初始化等,只会被执行一次
def fun():
print('hi')
参考网站: