标签: nginx-config

如何为 REST API 正确配置 Nginx 缓存?

案例:我有通过 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 标头,或者响应的大小对于缓存来说太小?

caching nginx nginx-config

7
推荐指数
1
解决办法
8477
查看次数

使用keepalive反向代理并根据nginx中的TTL重新解析DNS

nginx 开源中的上游块允许您启用与反向代理服务器的保持活动连接(文档:http : //nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive)。

Syntax: keepalive connections;
Default: —
Context: upstream
Run Code Online (Sandbox Code Playgroud)

激活缓存以连接到上游服务器。

连接参数设置保留在每个工作进程的缓存中的上游服务器的空闲保持连接的最大数量。

但是,在 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 haproxy proxypass nginx-reverse-proxy nginx-config

7
推荐指数
0
解决办法
3251
查看次数

nginx.conf 文件中的 default_type application/octet-stream

在默认的 nginx 配置文件中,我看到 default_type 设置为 application/octet-stream。我了解 MIME 类型,但不明白为什么我们要设置默认类型。这个配置有什么意义呢?有人可以帮助我理解这一点吗?

包括/etc/nginx/mime.types;default_type 应用程序/八位字节流;

nginx nginx-reverse-proxy nginx-config

7
推荐指数
1
解决办法
6732
查看次数

将 nginx 日志发送到 syslog 和 stdout/stderr

默认情况下,我的nginx服务器将日志绘制到stdoutstderr

我想将日志转发到我的系统日志服务器,并且我已经成功做到了,来自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)

如何配置我的服务器以将日志绘制到stdoutstderr

stdout nginx stderr nginx-config

6
推荐指数
1
解决办法
5886
查看次数

如何在子文件夹中为 WordPress REST API 配置 nginx?

我正在尝试在我们的域下的子文件夹中设置多个 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测试成功

wordpress wordpress-rest-api nginx-config

6
推荐指数
2
解决办法
4215
查看次数

设置 nginx 使用多个 ssl 证书,无需多个服务器

我正在尝试使用 nginx 来拥有多个 ssl 证书,而不必为每个证书创建一个服务器。

因此,我构建了一个反向代理,它将有多个不同的站点运行相同的域。是否可以让服务器拥有多个 ssl 证书和密钥,以便在代理时使用正确的密钥和证书,或者我是否需要为生成的每个站点创建自己的服务器?

提前致谢。

ssl nginx nginx-config

6
推荐指数
1
解决办法
2万
查看次数

Kubernetes Nginx Ingress 文件上传返回 502

我正在尝试通过 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

6
推荐指数
1
解决办法
1万
查看次数

如何修复生产中的 502 Bad Gateway 错误(Nginx)?

当我尝试在数字海洋中托管的项目中上传大小约为 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)

python django nginx gunicorn nginx-config

6
推荐指数
1
解决办法
2万
查看次数

如何让 NGINX 在 Docker 中运行以重新加载 nginx.conf 配置

我正在尝试让基于 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 docker windows-subsystem-for-linux nginx-config wsl-2

6
推荐指数
1
解决办法
1万
查看次数

nginx:[emerg]此处不允许使用“stream”指令

我尝试使用 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检查时,出现了这个错误。谁能告诉我现在该怎么办?谢谢!

nginx stream nginx-config

6
推荐指数
0
解决办法
1万
查看次数