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 分别是什么?

  1. CGI:通用网关接口(Common Gateway Interface/CGI),CGI描述了服务器(nginx,apache)
    和请求处理程序(django,flask,springboot web框架)之间传输数据的一种标准

    • 所有bs架构软件都是遵循CGI协议的
    • 一句话总结: 一个标准,定义了客户端服务器之间如何传数据
  2. FastCGI:快速通用网关接口(Fast Common Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本

    • FastCGI致力于减少网页服务器与CGI程序之间互动的开销,从而使服务器可以同时处理更多的网页请求
    • 常见的fastcgi服务器:Apache,Nginx,Microsoft IIS
    • CGI的升级版
  3. WSGI:Python Web Server Gateway Interface,缩写为WSGI,Python定义的Web服务器(比如uWSGI) 和Web应用程序或框架(比如django)之间的一种通用的接口规范

    • 一句话总结:为Python定义的web服务器和web框架之间的接口标准
  4. uWSGI:符合wsgi协议的 web服务器,用c写的,性能比较高,咱们通常用来部署django,flask

    • 一句话总结:一个Web Server(web服务器),即一个实现了WSGI协议的服务器,处理发来的请求及返回响应。
    • uWSGI:项目上线使用的web服务器
    • wsgiref:测试阶段使用的
  5. 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完全可以完成整个的和浏览器交互的流程,但是要考虑到某些情况

  1. 安全问题,程序不能直接被浏览器访问到,而是通过nginx,nginx只开放某个接口,uwsgi本身
    是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用。
  2. 负载均衡问题,一个uwsgi很可能不够用,即使开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。
  3. 静态文件处理效率问题,用django或是uwsgi这种东西来负责静态文件的处理是很浪费的行为,而且他们本身对文件的处理也不如nginx好,所以整个静态文件的处理都直接由nginx完成,静态文件的访问完全不去经过uwsgi以及其后面的东西。这就是这几者之间的关系。
posted @ 2023-08-29 21:12  星空看海  阅读(90)  评论(0编辑  收藏  举报