在gin-gonic用作网络服务器和nginx代理服务器的网站中,客户端通过gin-conic公开的 API将他们的数据发送到服务器,并且为了向客户端发送服务器命令,每个(即客户端)都与网络服务器建立连接,并保留它很长一段时间(即几个小时内不会过期)并用所需的命令填充他们的响应主体(对于双向连接,我们可以使用它ws来代替)。
问题是我们需要了解客户端是否删除/取消了与服务器的连接。为了理解我们case <-c.Request.Context().Done():在下面的代码中有这一行。
func MakeConnection(c *gin.Context) {
// ... code
select {
case notification = <-clientModel.Channels[token]:// we have a command to send to user
log.Info("Notification")
err = nil
case <-c.Request.Context().Done(): // connection dropped by client
log.Info("Cancel")
err = c.Err()
case <-ctx.Done(): // time elapsed and there was no command to send to client
log.Info("timeout")
err = errors.New("timeout exceeded")
}
// ... code
}
Run Code Online (Sandbox Code Playgroud)
一切正常(如果我们与服务器建立这样的连接并在任意时间后取消它,立即Cancel显示在终端中),直到客户端数量增加。
对于大约 5 个客户端,这项工作按预期进行,但对于 …
nginx 开源中的上游块允许您启用与反向代理服务器的保持活动连接(文档:http : //nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive)。
Run Code Online (Sandbox Code Playgroud)Syntax: keepalive connections; Default: — Context: upstream激活缓存以连接到上游服务器。
连接参数设置保留在每个工作进程的缓存中的上游服务器的空闲保持连接的最大数量。
但是,在 nginx 开源中使用上游块有一些警告,特别是:DNS 会被缓存,直到重新启动或重新加载,而不管 TTL。这意味着,如果您使用带有 keepalive 的上游块来反向代理到 AWS 负载均衡器,当负载均衡器 IP 更改时,您将遇到停机时间,除非人员/服务重新加载或重新启动 nginx。“在变量中设置域名”(见下文),允许以 TTL 间隔或任何其他所需的间隔重新解析 DNS,但似乎不允许您启用保持连接。
是否可以在nginx开源中通过域名反向代理到另一台服务器的同时启用keepalive连接,并根据TTL重新解析DNS(无需服务器重新加载/重启)?(Nginx Plus 支持在上游块中重新解析 DNS)。如果单独使用 nginx 开源无法做到这一点,最好将 DNS 解析移动到 HAProxy 等另一层并指向 nginx 上游块中的该层?
nginx keepalive 和 dns 解析器几乎是相同的问题,但有以下区别:在这里,如果无法在 nginx 本身中完成,使用插件或不同的层是可以的。该问题的一个答案提到使用https://github.com/wdaike/ngx_upstream_jdomain,但这个插件似乎多年来没有改变,所以我怀疑将 DNS 解析移到另一层会更容易维护。
在以下对相关问题的评论中出现了类似的问题:Why does nginx proxy_pass close my connection?
在https://www.nginx.com/blog/dns-service-discovery-nginx-plus/ 中,提到了 nginx 的三种 DNS 服务发现方法,看起来它们都不允许重新解析 DNS nginx 重启/重新加载并使用上游参数,例如keepalive:
在 proxy_pass 指令中使用域名 …
在默认的 nginx 配置文件中,我看到 default_type 设置为 application/octet-stream。我了解 MIME 类型,但不明白为什么我们要设置默认类型。这个配置有什么意义呢?有人可以帮助我理解这一点吗?
包括/etc/nginx/mime.types;default_type 应用程序/八位字节流;
我已经有一个正在运行的 https 站点。我的以下配置适用于 webmin。除了当我登录时,网址重写了它旁边的端口号 10000,因此找不到错误服务器。任何人都可以帮我纠正这个吗?
server {
server_name webmin.example.com;
listen 443;
ssl on;
ssl_certificate /etc/webmin/miniserv.pem;
ssl_certificate_key /etc/webmin/miniserv.pem;
access_log off;
error_log off;
location /RequestDenied {
return 418;
}
location / {
proxy_pass https://127.0.0.1:10000;
proxy_redirect off;
#Proxy Settings
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 128k;
proxy_buffers 32 32k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个 NGINX 设置了反向代理和缓存(仅在很短的时间内缓存多个请求)。后端 nginx 调用在本地运行(反向代理地址为 localhost:8092)。后端有时需要重新启动,这会使其离线约 2-3 秒。目前,nginx 这次服务的是 502。我宁愿推迟那个时间的请求。是否可以将 nginx 配置为在出现 502 时等待并定期重试?
我知道这不是解决此问题的最干净的方法,但这不是生产系统,因此这(如果可能)似乎是最简单的解决方案。
系统运行 Ubuntu 16.04LTS 和 nginx 1.10.3
我正在使用 nginx 的 $geoip_country_code 模块根据 IP 重定向用户。我的配置代码如下所示-
server {
listen 80;
gzip on;
server_name example.com;
root html/example;
location / {
index index.html;
try_files /$geoip_country_code/index.html /index.html;
}
location ~* \.(gif|jpg|jpeg|png|js|css)$ { }
}
Run Code Online (Sandbox Code Playgroud)
想法是根据我已本地化的国家/地区重定向用户,否则用户将转到默认索引,即其他人通用的索引。当我在我的国家/地区的浏览器中打开它时,它可以完美地工作,因为我已经对其进行了本地化。但当从不同的国家/地区打开时,它会显示内部服务器错误。它不会进入默认索引页。
有人可以指出我做错了什么吗?
问题:Nginx 服务器正在缓冲服务器发送的事件(SSE)。
设置:节点 v12.13.1、Nginx 1.16.1、Chrome v80
场景:我尝试关闭缓冲,proxy_buffering off;甚至添加"X-Accel-Buffering": "no"到服务器响应标头中,但 nginx 仍在缓冲所有 SSE。如果我关闭节点服务器或重新启动 nginx 服务器,则所有 SSE 消息都会批量传递到客户端。我尝试了很多,但不知道我失踪了。
Nginx 配置文件:
events {
worker_connections 1024;
}
http {
include mime.types;
sendfile on;
keepalive_timeout 65;
server {
listen 4200;
server_name localhost;
location / {
proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_buffering off;
proxy_cache off;
proxy_pass http://localhost:8700;
}
}
}
Run Code Online (Sandbox Code Playgroud)
节点服务器:
var express = require('express');
var app = express();
var template =
`<!DOCTYPE html> <html> <body>
<script type="text/javascript">
var source …Run Code Online (Sandbox Code Playgroud) 我在 Nginx conf 中做出以下声明:
js_import http.js;
Run Code Online (Sandbox Code Playgroud)
但它似乎给了我unknown directive "js_import"
我已经验证njs是否安装了。我似乎可以进入cli。njs的版本是0.3.9
下面的语句似乎有效并且是放置http块:
js_include http.js
Run Code Online (Sandbox Code Playgroud)
这似乎也有效,并且被放置在server块内的块中http:
js_content hello
Run Code Online (Sandbox Code Playgroud)
Nginx 似乎是最新版本。
我似乎找不到我在这里缺少的东西。
任何帮助是极大的赞赏。
k8s 入口控制器不会将证书传递给上游 https 服务。
使用 nginx 我可以实现这样的目标
location /upstream {
proxy_pass https://backend.example.com;
proxy_ssl_certificate /etc/nginx/client.pem;
proxy_ssl_certificate_key /etc/nginx/client.key;
}
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?我当前的配置看起来像这样。我不希望来自客户端的 pass ssl 在此终止。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: backend
namespace: default
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: "/$1"
nginx.ingress.kubernetes.io/backend-protocol: HTTPS
nginx.ingress.kubernetes.io/secure-backends: "true"
nginx.ingress.kubernetes.io/proxy-ssl-secret: "proxy-ca-secret"
nginx.ingress.kubernetes.io/proxy-ssl-name: "backend.example.com"
spec:
rules:
- http:
paths:
- path: /(api/auth/.*)
backend:
serviceName: auth
servicePort: 8080
Run Code Online (Sandbox Code Playgroud)
日志显示
SSL_do_handshake() failed (SSL: error:14094412:SSL routines:ssl3_read_bytes:sslv3 alert bad certificate:SSL alert number 42) while SSL handshaking to upstream
Run Code Online (Sandbox Code Playgroud)
我使用 openssl 证书验证了 base64 证书,看起来不错。提前致谢!
reverse-proxy nginx kubernetes nginx-reverse-proxy kubernetes-ingress
我有以下 nginx 配置:
http {
log_format upstream_logging '[proxied request] '
'$server_name$request_uri -> $upstream_addr';
access_log /dev/stdout upstream_logging;
server {
listen 80;
server_name localhost;
location ~ /test/(.*)/foo {
proxy_pass http://127.0.0.1:3000/$1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我击中时:
http://localhost/test/bar/foo
Run Code Online (Sandbox Code Playgroud)
我的实际输出是:
[proxied request] localhost/test/bar/foo -> 127.0.0.1:3000
Run Code Online (Sandbox Code Playgroud)
虽然我的预期输出是:
[proxied request] localhost/test/bar/foo -> 127.0.0.1:3000/bar
Run Code Online (Sandbox Code Playgroud)
是否有变量或方法可以在日志中生成实际的代理 URI?
server-configuration nginx proxypass server nginx-reverse-proxy