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

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

ztj100 2025-04-06 00:44 5 浏览 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



相关推荐

配置Java环境变量:(WIN7为例)(java1.7配置环境变量)

1.JAVA_HOME变量的设置2.Path变量的设置3.ClassPath变量的设置二、JDK安装群文件下载好之后,进入文件夹,双击根据提示进行安装,直至安装完成。(建议默认地址,一下以默认...

JDK的下载安装与环境变量的配置(jdk安装教程及环境变量配置win10)

一、JDK下载1.jdk下载地址官网https://www.oracle.com2.选择Products3.选择Java4.选择JavaSE,进入OracleJDK5.根据需要选择版本6.我所...

linux java 项目 设置外部yml 设置jvm 并添加启动停止以及重启脚本

linux安装jdk1.8jdk1.8可私聊我发给你1.在/usr/local下用mkdir新建了一个文件夹java然后把文件上传到java里面...

JDK1.8安装&环境变量配置(jdk怎么安装环境变量)

1、下载并安装JDK1.8链接:https://pan.baidu.com/s/1bfceFjfTQvLylu7a3T7fyg?pwd=ydtm...

Java 技术文档(详细版)(java文档教程)

1.简介Java是一种面向对象的编程语言,由SunMicrosystems于1995年发布,现由Oracle公司维护。其核心特点是“一次编写,到处运行”,这得益于Java虚拟机(...

JavaJDK环境变量配置(javajdk环境变量配置不用配置路径吗)

1.Java环境搭建1.1JDK与JREJDK(JavaDevelopmentKitJava开发工具包)JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE。所...

Java编程从零开始 01Java的安装和配置

点击右上角,加关注,私信“项目课程”,即可获得高并发分布式电商项目以及适合初学者的网盘项目课程视频和源码哦...

《我的世界》服务器搭建(搭建我的世界服务器配置要求)

1.CentOS7环境1.1更改YUM源...

java入门教程1 - 安装和配置(win和linux)

windows安装和配置安装java...

Java基础篇——环境配置(java环境搭建及配置教程)

Java语言简介Java语言源自于Oracle-Sun公司,是当今最通用、最流行的软件开发语言之一。Java是简单的、面向对象的语言,最大的特性是与平台无关,有“writeonce,runeve...

Java路径-02-Java环境配置(java环境变量配置路径)

1Window环境配置1.1下载...

JDK的安装与环境变量的配置(jdk安装好如何配置环境变量?用什么符合隔开?)

JDK的安装与环境变量的配置1.jdk的安装:jdk的安装,傻瓜式安装,一路下一步jdk中的两个文件夹libbin...

Centos8搭建Java环境(JDK1.8+Nginx+Tomcat9+Redis+Mysql)

一、开篇1.1目的每次换新的服务器,都要找资料配下环境,所以我写这篇文章,重新梳理了一下,方便了自己,希望也能给大家带来一些帮助。安装的软件有:JDK1.8+Nginx+Tomcat9+...

Windows系统——配置java环境变量

怎么配置java环境变量呢?首先是安装好jdk然后我的电脑右键选择属性然后选择左侧高级系统设置高级然后点环境变量...

程序员:JDK的安装与配置(完整版)(jdk的安装与配置使用)

对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦...

取消回复欢迎 发表评论: