nginx、uWSGI
一 内网穿透
https://zhuanlan.zhihu.com/p/370483324
内网穿透是外部可以访问到局域网中的机器
我们写了一个网站,但是又苦于没有公网ip地址,就可以使用内网穿透,来让局域网内的机器上的,可以被外网访问到
这种软件有很多:
- 如开源的:frp、ngrok
- 商业的软件:花生壳(转发http需要收费6元)、神卓互联(收费)
- 基于Python3 我们自己写一个
软件把外网的请求转发给了内网。
二 nginx是什么
Nginx是一个轻量级、高性能、稳定性高、并发性好的HTTP和反向代理服务器。也是由于其的特性,其应用非常广。
2.1 正向代理和反向代理
代理
代理其实就是一个中介,A和B本来可以直连,中间插入一个C,C就是中介。
刚开始的时候,代理多数是帮助内网client访问外网server用的
后来出现了反向代理,"反向"这个词在这儿的意思其实是指方向相反,即代理将来自外网客户端的请求转发到内网服务器,从外到内。
正向代理
正向代理类似一个跳板机,代理访问外部资源
比如我们国内访问谷歌,直接访问访问不到,我们可以通过一个正向代理服务器,请求发到代理服,代理服务器能够访问谷歌,这样由代理去谷歌取到返回数据,再返回给我们,这样我们就能访问谷歌了
正向代理的用途:
- 1 访问原来无法访问的资源,如google
- 2 可以做缓存,加速访问资源
- 3 对客户端访问授权,上网进行认证
- 4 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
- 5 代理中间进行拦截,可以进行访问控制,限制客户端对内部网络资源的访问。
反向代理
反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
反向代理的作用:
- 1 保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网
- 2 负载均衡,通过反向代理服务器来优化网站的负载
- 3 可以进行会话保持,确保客户端请求连续发送到同一个后端服务器上,保证用户体验。
- 4 可以进行 SSL 加密和解密,提高数据传输的安全性。
- 5 可以通过 CDN 等手段优化网络带宽使用,提高客户端访问速度。
2.2 nginx介绍
主要功能有:
-
反向代理
做请求转发。用户发送了一个http请求,nginx代理服务器接收请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端。 -
负载均衡
负载均衡:多在高并发情况下需要使用。其原理就是将数据流量分摊到多个服务器执行,减轻每台服务器的压力,多台服务器(集群)共同完成工作任务,从而提高了数据的吞吐量。 -
动静分离
Nginx提供的动静分离是指把动态请求和静态请求分离开,合适的服务器处理相应的请求,使整个服务器系统的性能、效率更高。
Nginx可以根据配置对不同的请求做不同转发,这是动态分离的基础。静态请求对应的静态资源可以直接放在Nginx上做缓冲,更好的做法是放在相应的缓冲服务器上。动态请求由相应的后端服务器处理。
2.3 nginx负载均衡
负载均衡(Load Balance)意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
单从字面上的意思来理解就可以解释N台服务器平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。那么负载均衡的前提就是要有多台服务器才能实现,也就是两台以上即可。
负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
nginx的负载均衡
所谓负载均衡,就是 Nginx 把请求均匀的分摊给上游的应用服务器,这样即使某一个服务器宕机也不会影响请求的处理,或者当应用服务器扛不住了,可以随时进行扩容。
# 1: 在server外面增加配置upstream
upstream 名字 {
server 127.0.0.1: 8080;
server 127.0.0.1: 8081;
}
# 2: 指定上游名字,则会随机选择其中一个转发。
location / {
include uwsgi_params;
uwsgi_pass 名字;
}
负载均衡策略:https://www.cnblogs.com/liuqingzheng/p/16322504.html
2.4 nginx动静分离
是一种通过配置nginx服务器,将静态资源和动态资源分别存放在不同的服务器或路径上,以提高网站的性能和并发访问能力。把后端所有的静态文件收集起来,用nginx转发。
http {
server {
listen 80;
server_name example.com;
# 配置动态请求的转发
location ~* \.php$ {
proxy_pass http://dynamic_backend_server;
}
# 配置静态资源的处理
location /static/ {
root /path/to/static/folder;
expires 7d;
access_log off;
}
# 配置其它静态资源的处理
location /images/ {
root /path/to/images/folder;
expires 30d;
access_log off;
}
}
}
在上述配置中,动态请求(以.php结尾的请求)会被转发给名为dynamic_backend_server的后端服务器处理,而静态资源则会由nginx自身根据不同的URL路径进行处理。可以根据实际需求,将不同的静态资源放置在不同的路径或服务器上,并配置相应的location规则。
三 wsgi uwsgi uWSGI,cgi,fastcgi 分别是什么?
-
CGI:通用网关接口(Common Gateway Interface/CGI),CGI描述了服务器(nginx,apache)
和请求处理程序(django,flask,springboot web框架)之间传输数据的一种标准- 所有bs架构软件都是遵循CGI协议的
- 一句话总结: 一个标准,定义了客户端服务器之间如何传数据
-
FastCGI:快速通用网关接口(Fast Common Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本
- FastCGI致力于减少网页服务器与CGI程序之间互动的开销,从而使服务器可以同时处理更多的网页请求
- 常见的fastcgi服务器:Apache,Nginx,Microsoft IIS
- CGI的升级版
-
WSGI:Python Web Server Gateway Interface,缩写为WSGI,Python定义的Web服务器(比如uWSGI) 和Web应用程序或框架(比如django)之间的一种通用的接口规范
- 一句话总结:为Python定义的web服务器和web框架之间的接口标准
-
uWSGI:符合wsgi协议的 web服务器,用c写的,性能比较高,咱们通常用来部署django,flask
- 一句话总结:一个Web Server(web服务器),即一个实现了WSGI协议的服务器,处理发来的请求及返回响应。
- uWSGI:项目上线使用的web服务器
- wsgiref:测试阶段使用的
-
uwsgi:uWSGI服务器实现的独有的协议,用于定义传输信息的类型,是用于前端服务器与 uwsgi 的一种线路协议
- 一句话总结: uWSGI自有的一个协议
四 uWSGI跟Nginx
4.1 uWSGI跟Nginx的区别
uWSGI是一个web服务器,它实现了WSGI协议,uwsgi、http等协议。
Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换,
WSGI是一种Web服务器网关接口,他是一个Web服务器与web应用通信的一种规范
WSGI是一种通信协议
uwsgi是一种线路协议而不是通信协议,在此常用语在uWSGI服务器与其他网络服务器的数据通信
uWSGI是实现了uwsgi和WSGI两种协议的Web服务器
nginx是一个开源的高性能的HTTP服务器和反向代理:
1.作为web服务器,它处理静态文件和索引文件效果非常高
2.它的设计非常注重效率,最大支持5万个并发链接,但只占用很少的内存空间
3.稳定性高,配置简洁。
4.强大的反向代理和负载均衡功能,平衡集群中各个副武器的负载压力应用
4.2 uwsgi的配置
# 写一个uwsgi的配置文件,在项目路径下,新建一个 luffyapi.xml
<uwsgi>
<socket>127.0.0.1:8888</socket> # 内部端口,自定义,监听8888端口
<chdir>/home/project/luffy_api/</chdir> # 项目路径
<module>luffyapi.wsgi</module> # luffy_api下wsgi.py所在目录名
<processes>4</processes> # 进程数
<daemonize>uwsgi.log</daemonize> # 日志文件
</uwsgi>
# 新建一个luffyapi.xml,复制上面的配置
vi /home/project/luffy_api/luffyapi.xml
# 使用uwsgi启动
uwsgi -x luffyapi.xml
# 查看是否正常运行
ps aux |grep uwsgi
4.3 nginx配置
https://blog.csdn.net/weixin_38175358/article/details/117215209
events { # 工作模式与连接数上限
worker_connections 1024; # 单个进程最大连接数(最大连接数=连接数*进程数)
}
http { # 设定http服务器
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; # 默认文件类型,二进制文件,浏览器会直接把它下载下来
sendfile on; # 开启高效文件传输模式
server {
listen 80; # 监听80端口
server_name 127.0.0.1; # 定义主机名
charset utf-8;
# 前端静态资源的处理
location / { # 匹配url
root /home/html; # 定义服务器的默认网站根目录位置
index index.html; # 定义首页索引文件的名称
try_files $uri $uri/ /index.html; # 在指定文件系统中查找文件并返回给客户端
}
}
server {
listen 8000;
server_name 127.0.0.1;
charset utf-8;
location / { # 动态请求的转发
include uwsgi_params; # 包含uwsgi的请求参数
uwsgi_pass 127.0.0.1:8888; # # 转交给uwsgi
uwsgi_param UWSGI_SCRIPT luffy_api.wsgi;
uwsgi_param UWSGI_CHDIR /home/project/luffy_api/;
}
location /static { # 后端静态资源的转发
alias /home/project/luffy_api/luffy_api/static;
}
}
}
# alias path和root path的区别;
location /images/ {
root "/data/images"
}
http://fansik.fansik.com/images/a.jpg <-- /data/images/images/a.jpg
location /images/ {
alias "/data/images/"
}
http://fansik.fansik.com/images/a.jpg <-- /data/images/a.jpg
4.4 为什么有了 uwsgi 还要 nginx 服务器
首先nginx 是对外的服务接口,外部浏览器通过url访问nginx。nginx 接收到浏览器发送过来的http请求,将包进行解析,分析url,如果是静态文件请求就直接访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件。
如果不是静态文件,而是一个动态的请求,那么nginx就将请求转发给uwsgi,uwsgi 接收到请求之后将包进行处理,处理成wsgi可以接受的格式,并发给wsgi,wsgi 根据请求调用应用程序的某个文件,某个文件的某个函数,最后处理完将返回值再次交给wsgi,wsgi将返回值进行打包,打包成uwsgi能够接收的格式,uwsgi接收wsgi 发送的请求,并转发给nginx,nginx最终将返
回值返回给浏览器。
总结:要知道第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程,但是要考虑到某些情况
- 安全问题,程序不能直接被浏览器访问到,而是通过nginx,nginx只开放某个接口,uwsgi本身
是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用。 - 负载均衡问题,一个uwsgi很可能不够用,即使开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。
- 静态文件处理效率问题,用django或是uwsgi这种东西来负责静态文件的处理是很浪费的行为,而且他们本身对文件的处理也不如nginx好,所以整个静态文件的处理都直接由nginx完成,静态文件的访问完全不去经过uwsgi以及其后面的东西。这就是这几者之间的关系。