百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

11《Nginx 入门教程》Nginx反向代理(下)

off999 2025-01-06 14:49 28 浏览 0 评论

本小节,我们继续学习 Nginx 在 七层反向代理中的其它几种比较常见的情况,比如 web 服务中的 WebSocket 协议的反向代理和 uwsgi 协议的反向代理。

1. WebSocket的反向代理

WebSocket 是目前比较成熟的技术了, WebSocket 协议为创建客户端和服务器端需要实时双向通讯的 webapp 提供了一个选择。服务器可以向浏览器推送相关消息,这样在前端实现的某个页面中我们可以及时看到服务器的状态变化而不用使用定时刷新去获取后台信息。目前大部分浏览器都支持 WebSocket 协议,比如 Firefox,IE,Chrome,Safari,Opera,并且越来越多的服务器框架现在也同样支持 WebSocket。此外,在js、java 和 python 中都提供了 Websocket 开发库,这也使得 websocket 协议的广泛应用于 web 服务的开发中。当然作为浏览器和后台服务的中间代理的 Nginx 也必定支持 Websocket,这样能更好的完成代理角色。在 Nginx 中通过 ngx_http_proxy_module 模块实现 Websocket 反向代理功能,具体实现配置如下:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

上述配置表示将转发的协议提升至1.1, 同时在转发的 http 请求的头部中加上如下配置:

Upgrade: websocket
Connection: upgrade
代码块12

这两个字段表示请求服务器升级协议为 WebSocket。上游服务器处理完请求后,响应如下报文:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade

这个响应是告诉客户端已成功切换协议,升级为 Websocket 协议。握手成功之后,服务器端和客户端便角色对等,就像普通的 Socket 一样,能够双向通信。 不再进行 HTTP 的交互,而是开始 WebSocket 的数据帧协议实现数据交换。默认情况下,连接将会在无数据传输60秒后关闭,proxy_read_timeout 参数可以延长这个时间。源站通过定期发送 ping 帧以保持连接并确认连接是否还在使用。

通过以上简简单单的三行配置,我们就能在 Nginx 中轻松实现 Websocket 的反向代理,这也说明了 Nginx 的简单易用特点。

2. uwsgi的反向代理

首先,理清楚几个概念:

  • WSGI:全称是 Web Server Gateway Interface,WSGI 只是一种规范,描述 web server 如何与 web application 通信的规范。要实现 WSGI 协议,必须同时实现 web server 和 web application,当前运行在 WSGI 协议之上的 web 框架有 Flask, Django,这也是目前最流行的 python web框架。
  • uwsgi:与WSGI一样是一种通信协议,是uWSGI服务器的独占协议,用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型的描述。
  • uWSGI:是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等。

WSGI 协议其实是定义了一种 server 与 application 解耦的规范,即可以有多个实现 WSGI server 的服务器,也可以有多个实现 WSGI application 的框架,那么就可以选择任意的 server 和 application 组合实现自己的 web 应用。Django,Flask 框架都有自己实现的简单的WSGI server,一般用于服务器调试,生产环境下直接使用WSGI server。

Nginx 中将 http 协议的报文转换成 uwsgi 协议的报文,只需要使用 uwsgi_pass 指令即可。和 proxy_pass 指令类似,前者转发为 uwsgi 协议的报文,后者代理转发 http 协议的报文。其余用法一致。

Syntax: uwsgi_pass [protocol://]address;
Default: —
Context: location, if in location

用法示例:

...

http {
    ...
    server {
        listen 9000;
        
        location / {
            # 包含uwsgi请求描述文件
            include uwsgi_params;
            # 配置请求传递,socket地址
            uwsgi_pass 127.0.0.1:9000;
        }
    }
    ...
}
...

3. 案例测试

3.1 Websocket 反向代理

我们打开百度搜索"websocket在线测试",找到 websocket 的在线测试网站。

可以看到 121.40.165.18:8800 是该网站提供 websocket 连接的后端服务地址。我们借助这个地址来完成一个简单的测试。我们找一台公网上的云主机,其 ip 地址为 180.76.152.113,在上面搭建 Nginx 服务,添加监听9000端口的服务配置如下:

...
http {
    ...
    
    server {
        listen 9000;
        default_type text/plain;
        access_log logs/ws.log;
        location / {
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
           proxy_pass http://121.40.165.18:8800;
        }
    }
    
    ...
}
...

然后我们将 websocket 在线测试网站中的测试地址改成 ws://180.76.152.113:9000,断开后再次连接,发现也能成功,同时能实现原服务的功能。这说明我们的 Nginx 服务成功完成了 Websocket 代理功能。

3.2 uwsgi协议的反向代理

本次实验按照如下步骤进行:

  • 首先我们安装 WSGI server,直接使用 pip 安装即可:
pip install uwsgi -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 编写test.py文件:
def application(env, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [b'hello world\n',]
  • 启动 WSGI server并监听7000端口。
# 指定socket连接,监听端口,应用代码文件以及进程数
$ uwsgi --socket :7000 --wsgi-file test.py --master --processes 4
  • 在nginx.conf中添加如下 server 指令块:
server {
    listen 7001;
    default_type text/plain;
    access_log logs/uwsgi.log;
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:7000;
    }
}

  • 最后在本地可以请求 Nginx 服务地址的7001端口,可以看到返回 “hello world” 字符串,说明 Nginx 转发 uwsgi 协议成功。
[shen@shen ~]$ curl http://180.76.152.113:7001
hello world



相关推荐

免费离线单机斗地主(离线斗地主单机版免费)

想下载免流量不花钱斗地主,和麻将单机斗地主介绍:单机斗地主游戏是一款不需要联网的棋牌类手机游戏,此款斗地主最大的亮点是拥有强大的AI以及智能的提示功能。电脑具有很高的人工智能,为玩家提供了强劲的对手,...

58动漫(58动漫 官方入门网站)

打不开的原因可能有很多种,需要一一排查。首先要检查自己是否连接上了互联网,如果没有,就先联网。其次看一下叔叔有没有攻击。可能动漫网的版本比较低导致无法打开假的,58上面很多招聘工作跟他上线的信息不符合...

微信键盘输入法(微信键盘输入法下载)
  • 微信键盘输入法(微信键盘输入法下载)
  • 微信键盘输入法(微信键盘输入法下载)
  • 微信键盘输入法(微信键盘输入法下载)
  • 微信键盘输入法(微信键盘输入法下载)
精准客户电话号码采集软件(精准客户电话号码采集软件下载)

是正规平台。JMTOOL是一个采集工具软件。数据采集,又称数据获取,是利用一种装置,从系统外部采集数据并输入到系统内部的一个接口。数据采集技术目前广泛应用于各个领域。针对制造业企业的庞大生产数据,数据...

暴风影音5播放器手机安卓版下载

应该是清理软件或者安全软件禁止了软件的后台运行!下载安装暴风影音的具体方法如下:1、准备一个U盘,在电脑网络上下载暴风影音软件安装包(apk格式),复制并存储到U盘的根目录下。2、将U盘插入电视US...

cultivate(cultivate用英语怎么说)

"Nurture"和"cultivate"是两个动词,都可以用来描述培养、促进或发展某种事物。然而它们的具体用法和涵义稍有不同。"Нurture"...

腾讯手机管家电脑版(腾讯手机管家电脑版官方下载)

手机管家关闭电脑的方法。首先,打开电脑管家主页面。2.再点击“更多选项”图标。3.然后,点击“设置”。4.选择“手机管理”。5.勾选“不需要提醒”。6.再单击“确定”。7.最后,我们关闭面...

腾讯qq最新版下载(腾讯qq下载2019 8.0版)

可能是网速问题!或者你先看看你是否已经下载安装了QQ游戏,是不是最新的版本,如果之前没问题的话你不要到QQ页面进QQ游戏,试试从我的电脑中的文件夹中进入,再不行的话或者重新安装下QQ游戏:再不行的话建...

qq邮箱手机版登录(手机qq邮箱app登录)
  • qq邮箱手机版登录(手机qq邮箱app登录)
  • qq邮箱手机版登录(手机qq邮箱app登录)
  • qq邮箱手机版登录(手机qq邮箱app登录)
  • qq邮箱手机版登录(手机qq邮箱app登录)
樱花校园模拟器中文版下载(樱花校园模拟器 下载)

1可以在应用商店搜索“校女园模拟器”下载最新版本。2原因是应用商店会及时更新最新版本,而且下载安装十分方便快捷。3如果在应用商店找不到最新版本,可以在官方网站进行下载,但需要注意安全问题。同时,...

单机斗地主 单机版 免费版下载

免费的单机斗地主有《欢乐斗地主单机版》联众《单机斗地主》。1,《欢乐斗地主单机版》《欢乐斗地主单机版》是根据欢乐斗地主规则改编的pc电脑单机游戏。这是789游戏中心好玩的斗地主游戏,电脑具有较高的人工...

腾讯游戏平台官网入口(腾讯游戏平台官网入口网址)
  • 腾讯游戏平台官网入口(腾讯游戏平台官网入口网址)
  • 腾讯游戏平台官网入口(腾讯游戏平台官网入口网址)
  • 腾讯游戏平台官网入口(腾讯游戏平台官网入口网址)
  • 腾讯游戏平台官网入口(腾讯游戏平台官网入口网址)
三国志5手机版单机游戏(三国志5手机版单机游戏有哪些)

1.提示DirectX的话--下载驱动人生更新驱动重启,保证能玩2.如果不是上面问题试下--右键游戏图标,属性,兼容性,禁用桌面元素钩上就OK了3.发现安装后桌面的启动图标是GameSt...

免费的视频app网站入口(免费的视频app网站入口)

柠檬影院是个网站,柠檬影视是个软件柠檬影院是一个真正免费看电影电视剧的影视网站,以提供高清影视在线观看,下载,网络休闲等为最终发展目标,致力于给广大的互联网用户带来最丰富影视柠檬影院每日实时更新,每日...

光影魔术手手机版下载(光影魔术手手机版下载 app)

1、打开光影魔术手软件,点击“打开”。2、选好需要去除文字的图片,插入光影魔术手中。3、然后点击左上角的“数码暗房”按钮。4、在打开的页面中选择“人像”。5、下拉菜单,在“人像”中选择“祛斑”按钮。6...

取消回复欢迎 发表评论: