案例:我有通过 HTTPS 的 REST API,我想在我的主机上配置基本的缓存代理服务来缓存 API 请求并像往常一样更快地获取相同的信息。
我的 Nginx 配置如下:
proxy_cache_path /tmp/cache levels=1:2 keys_zone=my_cache:10m max_size=10g
inactive=60m use_temp_path=off;
http {
server {
location /my_api/ {
proxy_redirect off;
proxy_buffering on;
proxy_ignore_headers X-Accel-Expires;
proxy_ignore_headers Expires;
proxy_ignore_headers Cache-Control;
proxy_cache my_cache;
proxy_pass https://example.com/myapi/;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我正在比较 REST API 和我的本地代理服务的响应时间,并且 REST API 对远程服务的调用和对带有缓存的本地代理服务的响应时间是相同的,因此,这意味着缓存不会工作。另外,缓存目录是空的。
真实 API 的示例或请求(这不是真实情况):
curl "https://example.com/myapi/?key=1"
Run Code Online (Sandbox Code Playgroud)
代理请求示例:
curl "http://127.0.0.1:8080/myapi/?key=1"
Run Code Online (Sandbox Code Playgroud)
在 REST API 标头中我可以看到
cache-control: max-age=0, no-cache, no-store, must-revalidate
Run Code Online (Sandbox Code Playgroud)
Nginx 能以某种方式忽略它吗?
我应该在代理配置中更改哪些内容才能看到 REST API 的提升?我想知道这个问题是否与 HTTPS 流量有关?或者 REST API 的响应可能有一些 NoChaching 标头,或者响应的大小对于缓存来说太小?
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 应用程序/八位字节流;
默认情况下,我的nginx服务器将日志绘制到stdout和stderr。
我想将日志转发到我的系统日志服务器,并且我已经成功做到了,来自nginx.conf:
server {
...
error_log syslog:server=localhost:5447,facility=local7,tag=nginx_client,severity=error;
access_log syslog:server=localhost:5447,facility=local7,tag=nginx_client,severity=info;
...
}
Run Code Online (Sandbox Code Playgroud)
如何配置我的服务器以将日志绘制到stdout和stderr?
我正在尝试在我们的域下的子文件夹中设置多个 WordPress 站点(即不是多站点),但我在配置 REST API 端点时遇到困难。例如,这个端点工作正常:
https://example.com/site1/?rest_route=/wp/v2/posts
Run Code Online (Sandbox Code Playgroud)
但是这个端点给出了 404:
https://example.com/site1/wp-json/wp/v2/posts
Run Code Online (Sandbox Code Playgroud)
我尝试在 nginx 配置中使用以下规则将失败的 url 重写为工作 url:
location /site1/wp-json {
rewrite ^/site1/wp-json(.*)$ /site1/?rest_route=$1;
}
location /site1/ {
try_files $uri $uri/ /site1/index.php$is_args$args;
}
Run Code Online (Sandbox Code Playgroud)
我在WordPress 文档或nginx wiki中看不到对 wp-json 的任何特殊处理。我在这里缺少什么?该网站的永久链接设置为Numeric( https://example.com/site1/archives/123如果这可能起作用,
编辑后的完整配置文件的要点和配置语法 lints 正常:
nginx -c /etc/nginx/nginx.conf -t
Run Code Online (Sandbox Code Playgroud)
nginx:配置文件/etc/nginx/nginx.conf语法正确
nginx:配置文件/etc/nginx/nginx.conf测试成功
我正在尝试使用 nginx 来拥有多个 ssl 证书,而不必为每个证书创建一个服务器。
因此,我构建了一个反向代理,它将有多个不同的站点运行相同的域。是否可以让服务器拥有多个 ssl 证书和密钥,以便在代理时使用正确的密钥和证书,或者我是否需要为生成的每个站点创建自己的服务器?
提前致谢。
我正在尝试通过 nginx 入口从客户端上传文件。收到 413 响应后,我在入口上设置了以下注释;
Annotations: nginx.ingress.kubernetes.io/body-size: 1024m
nginx.ingress.kubernetes.io/client-body-buffer-size: 50m
nginx.ingress.kubernetes.io/client-max-body-size: 50m
nginx.ingress.kubernetes.io/proxy-body-size: 1024m
nginx.ingress.kubernetes.io/proxy-buffer-size: 32k
nginx.ingress.kubernetes.io/proxy-buffers-number: 8
Run Code Online (Sandbox Code Playgroud)
客户端是一个 Angular 应用程序。它在请求正文中发送文件的 Base64 字符串。我尝试过上传几 KB 的图像,所以我绝对没有达到这些限制。我是 Kubernetes 新手。需要重启ingress才能让这些注解生效吗?
我也尝试过创建一个 ConfigMap;
apiVersion: v1
kind: ConfigMap
metadata:
name: app-ingress-configuration
namespace: development
labels:
app.kubernetes.io/name: [name of ingress]
app.kubernetes.io/part-of: [name of ingress]
data:
proxy-connect-timeout: "50"
proxy-read-timeout: "120"
proxy-send-timeout: "120"
body-size: "1024m"
client-body-buffer-size: "50m"
client-max-body-size: "50m"
proxy-body-size: "1024m"
proxy-buffers: "8 32k"
proxy-buffer-size: "32k"
Run Code Online (Sandbox Code Playgroud)
仍然得到502。
不知道如何通过 kubectl 访问 nginx.conf,从文档看来,如果我更新此 ConfigMap,则 nginx 中的设置无论如何都会更改。
任何帮助表示赞赏。
更新
nginx.conf
# Configuration …Run Code Online (Sandbox Code Playgroud) nginx kubernetes kubernetes-ingress nginx-config nginx-ingress
当我尝试在数字海洋中托管的项目中上传大小约为 600MB 的大 csv 文件时,它尝试上传但显示 502 Bad Gateway Error (Nginx)。
该应用程序是一个数据转换应用程序。
这在本地工作时效果很好。
sudo tail -30 /var/log/nginx/error.log
Run Code Online (Sandbox Code Playgroud)
节目
[error] 132235#132235: *239 upstream prematurely closed connection while reading response header from upstream, client: client's ip , server: ip, request: "POST /submit/ HTTP/1.1", upstream: "http://unix:/run/gunicorn.sock:/submit/", host: "ip", referrer: "http://ip/"
sudo nano /etc/nginx/sites-available/myproject
Run Code Online (Sandbox Code Playgroud)
节目
server {
listen 80;
server_name ip;
client_max_body_size 999M;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
alias /root/static/;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock; …Run Code Online (Sandbox Code Playgroud) 我正在尝试让基于 NGINX 的反向代理在 Windows/WSL2 环境中工作。我对 Docker 和 NGINX 世界非常陌生。我能够让以下命令工作
docker run --name nginx-test -p 8080:80 -v /home/skotekar/nginx.conf:/etc/nginx/nginx.conf:ro -v /mnt/d/site1/wwwroot:/usr/share/nginx/html:ro -d nginx:alpine
Run Code Online (Sandbox Code Playgroud)
然后我可以浏览 http://localhost:8080 并查看我的静态内容。正如您从命令中看到的,我的本地/home文件夹中有一个默认的nginx.conf,运行时该文件夹会映射到 NGINX Docker。第一次效果很好。
现在,如果我使用以下命令停止容器:
docker container stop nginx-test
Run Code Online (Sandbox Code Playgroud)
然后对/home目录中的nginx.conf文件进行更改,并希望使用以下命令启动具有更新配置的容器:
docker container start nginx-test
Run Code Online (Sandbox Code Playgroud)
但是这个命令失败给了我一个非常令人困惑的消息:
来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:370: 启动容器进程导致:process_linux.go:459: 容器初始化导致:rootfs_linux.go:59: 挂载“/run/desktop/mnt/host/wsl/ docker-desktop-bind-mounts/Ubuntu-20.04/c0d0caa87ff063ee46265048f5b1ee489a8945669d39c6f6110cd578b8cda1ed”到 rootfs 位于“/var/lib/docker/overlay2/4e6b279945acb06200b3677272774f 4b5fbb6a619214decbca8c594dbbe3b8ec/merged/etc/nginx/nginx.conf”导致:没有这样的文件或目录:未知
让它重新运行的唯一方法是删除容器并再次使用第一个命令。知道如何让它发挥作用。如果我可以在更改配置后重新启动容器,直到找出所需的正确反向代理设置,那就更容易了。
谢谢
我尝试使用 nginx 设置负载均衡器,通过/etc/nginx/sites-available/test.conf为其创建文件和符号链接来将客户端 IP 保留在后端节点
stream {
upstream backend_servers {
server http://server1.com;
server http://server2.com;
}
server {
listen 80;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass backend_servers;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行nginx -t检查时,出现了这个错误。谁能告诉我现在该怎么办?谢谢!