nginx push_upstream模块的websocket

本文介绍如何安装并配置 Nginx 的 WebSocket 模块,实现消息推送功能。具体步骤包括:模块安装、Nginx 配置修改、通过 cURL 测试连接状态及数据发送接收,最后提供了 HTML5 和 Ruby 客户端示例代码。
参考
[url]https://www.rails365.net/articles/websocket-wai-pian-nginx-push-stream-module-mo[/url]
安装
git clone https://github.com/wandenberg/nginx-push-stream-module
./configure --add-module=/Users/haoning/tool/nginx/nginx-push-stream-module --prefix=/usr/local/nginx_push_stream
make
make install

nginx配置加入

push_stream_shared_memory_size 32M;
server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location /channels-stats {
# activate channels statistics mode for this location
push_stream_channels_statistics;

# query string based channel id
push_stream_channels_path $arg_id;
}

location /pub {
# activate publisher (admin) mode for this location
push_stream_publisher admin;

# query string based channel id
push_stream_channels_path $arg_id;
}

location ~ /ws/(.*) {
# activate websocket mode for this location
push_stream_subscriber websocket;

# positional channel path
push_stream_channels_path $1;
# message template
push_stream_message_template "{\"id\":~id~,\"channel\":\"~channel~\",\"text\":\"~text~\"}";

push_stream_websocket_allow_publish on;

# ping frequency
push_stream_ping_message_interval 10s;
}


启动nginx
测试查看状态
curl -s -v 'http://localhost/channels-stats'

测试写入
curl http://localhost/pub\?id\=ch1 -d "Some Text" {"channel": "ch1", "published_messages": 1, "stored_messages": 0, "subscribers": 1}

h5的客户端代码

<html>
<head>
<script>
var ws = null;
function connect() {
if (ws !== null) return log('already connected');
ws = new WebSocket('ws://localhost/ws/ch1');
ws.onopen = function () {
log('connected');
};
ws.onerror = function (error) {
log(error);
};
ws.onmessage = function (e) {
log('recv: ' + e.data);
};
ws.onclose = function () {
log('disconnected');
ws = null;
};
return false;
}
function disconnect() {
if (ws === null) return log('already disconnected');
ws.close();
return false;
}
function send() {
if (ws === null) return log('please connect first');
var text = document.getElementById('text').value;
document.getElementById('text').value = "";
log('send: ' + text);
ws.send(text);
return false;
}
function log(text) {
var li = document.createElement('li');
li.appendChild(document.createTextNode(text));
document.getElementById('log').appendChild(li);
return false;
}
</script>
</head>
<body>
{"name": "Bruce.Lin", "age": 25}
<form onsubmit="return send();">
<button type="button" onclick="return connect();">
Connect
</button>
<button type="button" onclick="return disconnect();">
Disconnect
</button>
<input id="text" type="text">
<button type="submit">Send</button>
</form>
<ol id="log"></ol>
</body>
</html>


ruby的客户端代码

require 'net/http'

uri = URI("http://localhost/pub\?id\=ch1")
http = Net::HTTP.new(uri.host, uri.port)

req = Net::HTTP::Post.new(uri.to_s)
req.body = 'Some Text'

http.request(req)
<think>嗯,用户想了解Nginx配置文件中http块的功能和配置项含义。这个问题很专业,用户可能是运维工程师或后端开发人员,正在搭建或优化Web服务器。从提问方式看,用户对Nginx有一定基础,但需要系统性的模块解析。 用户提供的参考资料很关键,特别是引用[1]和[4]直接关联http块。引用[1]提到http块负责定义MIME类型、日志格式等通用HTTP参数,引用[4]补充了http块内日志的继承特性。这些需要重点整合到回答中。 http块作为Nginx处理HTTP流量的核心模块,其配置结构需要分层说明。我决定从顶层设计切入:先说明http块在整体配置文件中的位置(介于events块和server块之间),再逐层展开其子模块。这样符合配置文件的逻辑顺序。 对于参数解释,要区分全局参数和层级参数。比如log_format指令是全局生效的,而access_log可以在不同层级覆盖。这种差异容易引发配置错误,需要明确标注。另外,gzip、keepalive_timeout等常用参数必须给出典型值参考,这对用户实际调试有帮助。 注意到引用[3]提到的配置解析机制很有趣——Nginx会根据指令类型(NGX_MAIN_CONF等)决定配置存储位置。虽然用户没直接问原理,但在"配置继承"部分可以渗透这个设计思想,帮助用户理解为什么location块能覆盖server块的配置。 最后考虑补充两个实用技巧:一是include指令优化配置文件结构,二是用nginx -T验证配置。用户既然研究http块,大概率正在编写复杂配置,这些技巧能立即提升效率。 相关问题设计要覆盖进阶需求:配置优化方向(HTTP/2)、调试方法(日志诊断)、安全加固(CSP),这样用户看完回答自然知道下一步学什么。</think>好的,我们来详细解释一下 Nginx 配置文件中 `http` 模块的功能及其主要参数的作用。 `http` 块是 Nginx 配置中处理 **HTTP 和 HTTPS 流量**的核心模块,它包含了所有与 HTTP 协议相关的配置。它通常嵌套在 `main`(全局)块之内,并包含多个 `server` 块(定义虚拟主机)以及影响所有 `server` 的全局 HTTP 设置。其结构大致如下: ```nginx # 全局块 (main context) - 影响整个 Nginx 进程 user nginx; worker_processes auto; error_log /var/log/nginx/error.log; ... events { # 事件块 (events context) - 配置网络连接模型 worker_connections 1024; ... } http { # HTTP 块开始 - 所有 HTTP/HTTPS 相关配置 # ===== HTTP 块内部的全局配置 ===== # 这些配置项会影响该 http 块内所有的 server 和 location include /etc/nginx/mime.types; # 包含 MIME 类型定义文件 default_type application/octet-stream; # 默认 MIME 类型 # 日志格式定义 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 访问日志路径和使用的格式 (可在 server/location 覆盖) access_log /var/log/nginx/access.log main; # 性能优化相关 sendfile on; # 启用高效文件传输模式 tcp_nopush on; # 优化 TCP 数据包发送 tcp_nodelay on; # 禁用 Nagle 算法,降低延迟 keepalive_timeout 65; # 客户端长连接超时时间(秒) types_hash_max_size 2048; # MIME 类型哈希表大小 # 压缩相关 gzip on; # 启用 gzip 压缩 gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 指定压缩类型 gzip_min_length 1000; # 最小压缩文件大小 gzip_comp_level 6; # 压缩级别 (1-9) # 其他全局设置 server_tokens off; # 隐藏 Nginx 版本信息 (安全增强) client_max_body_size 20M; # 客户端请求体最大大小 (可在 location 覆盖) # 包含其他配置文件 (通常用于组织多个 server 配置) include /etc/nginx/conf.d/*.conf; # ===== Server 块 (虚拟主机定义) ===== server { listen 80; # 监听端口 server_name example.com www.example.com; # 服务器名称 (域名) # Server 块内部的配置 (可覆盖 http 全局设置) root /usr/share/nginx/html; # 网站根目录 index index.html index.htm; # 默认索引文件 # Location 块 (URL 路由和请求处理) location / { try_files $uri $uri/ /index.html; # 尝试按顺序查找文件 } location /static/ { alias /data/static/; # 使用别名映射路径 expires 30d; # 设置缓存过期时间 } location /api/ { proxy_pass http://backend_server; # 反向代理到后端应用 proxy_set_header Host $host; # 传递 Host 头 proxy_set_header X-Real-IP $remote_addr; # 传递真实客户端 IP } # 错误页面处理 error_page 404 /404.html; error_page 500 502 503 504 /50x.html; } # 可以定义更多的 server 块... } # HTTP 块结束 ``` **核心功能与主要参数详解:** 1. **MIME 类型处理:** * `include mime.types;`: 包含一个预定义的 MIME 类型映射文件(通常位于 `/etc/nginx/mime.types`),该文件将文件扩展名(如 `.html`, `.css`, `.js`, `.jpg`)映射到相应的 `Content-Type` 响应头(如 `text/html`, `text/css`, `application/javascript`, `image/jpeg`)。 * `default_type application/octet-stream;`: 当 Nginx 无法根据文件扩展名确定 MIME 类型时,默认使用的类型。`application/octet-stream` 表示未知的二进制流,浏览器通常会将其视为下载。 2. **日志记录:** * `log_format <name> <format_string>;`: **定义**日志记录的格式。`<name>` 是为该格式指定的标识符(如 `main`),`<format_string>` 是由 Nginx 变量组成的字符串,定义了日志中每条记录包含哪些信息(如客户端 IP、时间、请求方法、状态码、响应大小、Referer、User-Agent 等)。 * `access_log <path> [<format_name> [buffer=size] [gzip[=level]] [flush=time]];`: **启用**访问日志并指定其存储路径、使用的格式(通过 `log_format` 定义的名称)、以及可选的缓冲区设置、压缩和刷新策略。在 `http` 块设置的是全局默认访问日志,可以在 `server` 或 `location` 块中覆盖此设置。`access_log off;` 可关闭日志。 * `error_log <path> [level];`: 配置错误日志的路径和记录级别(如 `debug`, `info`, `notice`, `warn`, `error`, `crit`, `alert`, `emerg`)。注意,`error_log` 可以在 `main`, `http`, `server`, `location` 块中设置,低层级的设置会覆盖高层级的设置[^4]。 3. **性能优化:** * `sendfile on|off;`: 启用(`on`)操作系统内核的 `sendfile` 系统调用来高效地传输文件内容,减少用户空间和内核空间之间的数据拷贝,提升静态文件服务性能。通常启用。 * `tcp_nopush on|off;`: 仅在 `sendfile on;` 时有效。启用后,Nginx 会尝试在一个 TCP 包中发送完整的 HTTP 响应头(headers)和文件数据的开始部分。需要与 `tcp_nodelay off;` 配合使用。通常启用。 * `tcp_nodelay on|off;`: 控制是否启用 TCP_NODELAY 选项。启用(`on`)会禁用 Nagle 算法,允许小数据包立即发送,降低延迟,特别适合高交互性应用(如 WebSockets)或低延迟要求场景。对于纯静态文件服务器,权衡延迟和带宽后可能关闭(`off`)。现代配置中通常启用。 * `keepalive_timeout <timeout> [header_timeout];`: 设置客户端长连接(keep-alive)在服务器端保持打开状态的最长时间(秒)。`<timeout>` 是连接保持空闲的超时时间。可选的 `header_timeout` 设置 `Keep-Alive: timeout=time` 响应头的值(较少用)。合理设置可以减少 TCP 连接建立/断开的开销。 * `keepalive_requests <number>;`: 设置一个长连接上允许的最大请求数。达到此数量后,连接将被关闭(即使未超时)。默认值通常足够。 * `client_max_body_size <size>;`: 设置客户端请求体(request body)的最大允许大小。如果请求体超过此值,Nginx 将向客户端返回 `413 (Request Entity Too Large)` 错误。对于文件上传场景尤其重要。可在 `server` 或 `location` 块覆盖。 * `client_body_buffer_size <size>;`: 设置用于读取客户端请求体(request body)的缓冲区大小。如果请求体大于此缓冲区,会被写入临时文件。优化此值可减少磁盘 I/O。 4. **压缩:** * `gzip on|off;`: 启用或禁用 gzip 响应压缩。压缩可以显著减少传输的数据量,提高页面加载速度,但会增加服务器 CPU 开销。 * `gzip_types <mime_types>;`: 指定哪些 MIME 类型的响应需要被压缩。通常压缩文本类资源(如 `text/html`, `text/css`, `application/javascript`, `application/json`, `text/xml` 等)。图像、视频等通常已压缩,无需再压缩。 * `gzip_min_length <length>;`: 设置启用压缩的最小响应长度(字节)。太小的文件压缩效果不明显甚至可能变大。 * `gzip_comp_level <level>;`: 设置 gzip 压缩级别(1-9)。级别越高压缩比越大,但 CPU 消耗也越高。通常建议在 4-6 之间取得平衡。 * `gzip_vary on|off;`: 启用时,会在响应中添加 `Vary: Accept-Encoding` 头,告知缓存服务器该响应可能根据客户端的 `Accept-Encoding` 头(是否支持压缩)有不同的版本。通常启用。 5. **安全与信息控制:** * `server_tokens on|off|build|string;`: 控制是否在错误页面和 `Server` 响应头中显示 Nginx 版本号。`off` 会隐藏版本号,只显示 “nginx”,是重要的安全加固措施。`build` 显示构建名称。`string` 允许自定义显示内容。 * `add_header <name> <value> [always];`: 向响应中添加自定义 HTTP 头。常用于添加安全相关的头,如: * `add_header X-Content-Type-Options "nosniff";`: 阻止浏览器 MIME 类型嗅探。 * `add_header X-Frame-Options "SAMEORIGIN";`: 防止页面被嵌入到 iframe 中(点击劫持防护)。 * `add_header Content-Security-Policy "default-src 'self'";`: 内容安全策略(CSP)。 * `add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";`: 强制 HTTPS (HSTS)。 * `[always]` 参数确保该头即使在错误响应(如 4xx, 5xx)中也会被添加。 6. **文件查找与索引:** * `root <path>;`: 设置请求的根目录。`$uri` 变量会附加在此路径后来查找文件。通常在 `server` 或 `location` 块设置。 * `index <file> ...;`: 定义当请求以斜杠(`/`)结尾时(即请求目录),Nginx 应尝试查找并返回的索引文件列表(如 `index.html`, `index.htm`, `index.php`)。按顺序查找。 7. **模块化组织:** * `include <file|mask>;`: 将指定文件或匹配指定模式的文件包含到当前配置位置。这是组织复杂配置的关键,常用于: * 包含 MIME 类型定义 (`include mime.types;`) * 包含多个虚拟主机配置 (`include /etc/nginx/conf.d/*.conf;`) * 包含特定功能的配置片段(如 SSL 配置、重写规则等)。 8. **定义上游服务器 (通常用于反向代理/负载均衡):** * 虽然 `upstream` 块通常也定义在 `http` 块内(与 `server` 块同级),但它本身不是 `http` 块的*参数*,而是定义了一组后端服务器,供 `proxy_pass` 等指令引用。 * `proxy_pass`, `proxy_set_header` 等指令通常在 `location` 块中使用,用于将请求转发到 `upstream` 定义的后端。 **配置继承:** * 在 `http` 块中设置的配置项(如 `access_log`, `gzip`, `log_format`, `sendfile`, `keepalive_timeout`, `default_type`)会作为其内部所有 `server` 块的**默认配置**。 * 在 `server` 块中设置的配置项会作为其内部所有 `location` 块的默认配置。 * 在 `location` 块中设置的配置项只作用于匹配该 `location` 的请求。 * 低层级块(`server` -> `location`)可以覆盖高层级块(`http` -> `server`)中定义的相同配置项的值(例如在某个 `location` 中设置 `gzip off;` 来禁用该特定 URI 的压缩)[^4]。 **总结:** `http` 块是 Nginx 处理 HTTP(S) 请求的总控中心。它负责: 1. **定义全局 HTTP 行为:** 如 MIME 类型、日志格式、性能优化选项(`sendfile`, `tcp_nopush`, `tcp_nodelay`, `keepalive`)、压缩设置、客户端请求限制等。 2. **组织虚拟主机:** 作为 `server` 块的容器,每个 `server` 块定义一个监听特定端口和域名的虚拟主机。 3. **提供公共配置的默认值:** `http` 块中的配置会被其内部的 `server` 块继承,`server` 块中的配置又会被其内部的 `location` 块继承。 4. **整合其他配置:** 通过 `include` 指令实现配置的模块化管理。 5. **为高级功能提供基础:** 如定义 `upstream` 块(负载均衡)、设置安全响应头等。 理解 `http` 块及其参数是高效、安全地配置和管理 Nginx Web 服务器的关键基础[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值