我目前在我的服务器上设置了 nginx my.server.com。使用当前配置,我使用http://my.server.com/app1或访问不同的应用程序http://my.server.com/app2。
我有一个这样的apps.conf位置:/etc/nginx/sites-enabled/
upstream app1_servers {
server 172.12.11.10:8080;
}
upstream app2_servers{
server 172.12.11.10:9090;
}
server {
listen 80;
server_name my.server.com;
return 301 https://my.server.com/$request_uri; #force https
}
server {
listen 443;
ssl on;
ssl_certificate /etc/ssl/my.server.com/cert.pem;
ssl_certificate_key /etc/ssl/my.server.com/priv.pem;
server_name my.server.com;
location /app1 {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto https;
proxy_pass http://app1_servers/app1;
proxy_redirect http://$host https://$host;
proxy_set_header Host $host;
}
location /app2 {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host; …Run Code Online (Sandbox Code Playgroud) 我的反向代理遇到一些奇怪的问题。
我的设置如下所示: 设置
localhost:3000现在,我的内部网络内的主机可以访问服务器上运行的应用程序srv1.my.domain.org,因此我知道配置正在运行。但是,一旦我尝试从网络外部(通过gateway.my.domain.org)访问该应用程序,我就会看到 NGINX 测试页面。我不明白为什么,因为我已经为多个其他应用程序完成了这个配置,并且它们正在工作。
注意:server_name与物理服务器的主机名相同。
以下是配置:
gateway.my.domain.org
小路:/etc/nginx/conf.d/app.my.domain.org.conf
upstream srv {
server srv1.my.domain.org;
}
server {
listen 443;
server_name gateway.my.domain.org;
ssl on;
ssl_certificate /.../fullchain.pem;
ssl_certificate_key /.../privkey.pem;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/gateway.access.log;
error_log /var/log/nginx/gateway.error.log;
client_max_body_size 150M;
location / {
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_set_header X-Forwarded-Proto $scheme;
proxy_pass http://srv;
proxy_read_timeout 90;
}
}
Run Code Online (Sandbox Code Playgroud)
srv1.my.domain.org
小路:/etc/nginx/sites-enabled/app
server {
listen …Run Code Online (Sandbox Code Playgroud) 当请求到来时,它会被重新路由到该请求的多个可用服务器之一。但只有 64k 端口可用,因此在任何给定时间最多只能有 64k 传出请求。那么一些网站如何服务数百万并发请求呢?如果有人能够消除这种混乱,那就太棒了。谢谢!
这个问题可能已经被问过好几次了,但是考虑到我能找到的所有结果和我所知甚少,我有点迷失了。我使用的是 Fedora 29。
我尝试用 nginx 做什么:
样本 :
application.domain.com --> https://hostname1.domain.local(或 IP 1)
test.domain.com --> https://hostname2.domain.local:1234(或 IP 2)
www.domain.com --> https://hostname3.domain.local(或IP 3)等...
我怎样才能做到这一点?让我们加密自动配置我的 nginx 配置,但这似乎有点太多了。
非常感谢您的回答,我觉得我得到了一些进步,即使暂时没有工作。我在这里发布了我的完整配置文件,因为我现在遇到了“502 Bad Gateway”错误。IP 与反向代理不在同一子网中,但完全可访问,没有防火墙或路由问题。
知道我可以在哪里继续前进吗?在原始配置中,还有一个包含密码和协议的 certbot conf 文件。也许我需要重新包含它?
另外:我尝试访问的内部服务器具有使用我自己的 AD CS 签名的证书,但反向代理上尚未安装根证书。也许我应该 ?
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个基于 docker 的多容器设置,其中包含多个域的反向代理以提供服务,其中网站、数据库和基于 nginx 的反向代理在容器中运行,但我不知道我在做什么丢失(我是 nginx 新手)。
\n\n细节:
\n\nmy_example_domain_1.com,my_example_domain_2.net我的例子: (basedir multi-container:)
nginx_revproxy/default.conf:
\n\nserver {\n listen 80;\n server_name localhost;\n\n location / {\n root /usr/share/nginx/html;\n index index.html index.htm;\n }\n\n error_page 500 502 503 504 /50x.html;\n location = /50x.html {\n root /usr/share/nginx/html;\n }\n}\n\nserver {\n listen 80;\n server_name my_example_domain_1.com;\n location …Run Code Online (Sandbox Code Playgroud) 我有一个正在工作的反向代理,它仅在我的站点中的特定位置上处于活动状态,在本例中例如:www.example.com/reverseproxy/site1我正在反向代理 site1。我想替换每个代理页面正文的某些部分,所以我尝试使用 mod_substitute,问题是我无法让它在<Location /reverseproxy>
这是我的 httpd(启用了 SSL):
<VirtualHost _default_:443>
ProxyPassInterpolateEnv On
RewriteEngine On
... Some rewrite rules
RewriteRule /?reverseproxy/http(s*):/([^\/]*)/*(.*) "http$1://$2/$3" [P]
SSLProxyEngine On
ProxyPassReverse "/reverseproxy/http${ssl}://${page}" http${ssl}://${page} interpolate
SetOutputFilter INFLATE;proxy-html;SUBSTITUTE;DEFLATE;
ProxyHTMLInterp On
ProxyHTMLExtended Off
...Some ProxyURLMap
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|<body>|<body1>|"
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
这个替代品确实有效,但它适用于所有页面,而不仅仅是/reverseproxy. 当我尝试将其放入时,<Location /reverseproxy>它不起作用,它只是忽略它:
<Location /reverseproxy>
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|<body>|<body1>|"
</Location>
Run Code Online (Sandbox Code Playgroud)
我尝试添加
RequestHeader unset Accept-Encoding
Run Code Online (Sandbox Code Playgroud)
在标签之外<Location>但它不起作用
我尝试添加这个
SetOutputFilter SUBSTITUTE;DEFLATE
Run Code Online (Sandbox Code Playgroud)
在<Location /reverseproxy>标签中但没有运气
正如有人建议尝试使用这个过滤器链
FilterDeclare filter
FilterProvider filter SUBSTITUTE …Run Code Online (Sandbox Code Playgroud) 我在 CentOS 7.8 上使用 Apache 2.4.43 以及 Varnish 6 和 PHP-FPM 来为 Magento 2 网站提供服务。
Varnish 侦听端口 80。Apache 侦听 8080 以向 Varnish 提供内容,并且还侦听端口 443,该端口将 HTTPS 请求代理到 Varnish,如下所示:
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:80/
RequestHeader set X-Forwarded-Port "443"
RequestHeader set X-Forwarded-Proto "https"
Run Code Online (Sandbox Code Playgroud)
这适用于大多数请求,但偶尔(约 10% 的请求)我会收到来自 Varnish 和 Apache 的 503 响应。我在 Apache 日志中看到的唯一错误是:
[proxy_http:error] [pid 6719:tid 140054596265728] (70008)Partial results are valid but processing is incomplete: [client x.x.x.x:53760] AH01110: error reading response, referer: http://example.com
Run Code Online (Sandbox Code Playgroud)
如果我重试该请求,它通常会立即起作用,尽管有时我必须刷新几次才能满足请求。我注意到,当发出大批量请求时(即包含数百个外部资源的页面),这种情况会更频繁地发生。我还注意到,这种情况似乎发生在较大的文件上,而不是较小的文件上。
我猜测这可能是某种超时,但我不确定要调整哪些值或如何进一步调试它。
我尝试过的事情包括以下内容:
我使用 Caddy 作为反向代理,这样我只需要在网关中打开 2 个端口(一个用于 http,一个用于 https)。
我更喜欢使用80和443,但我的 UniFi USG(网关)会干扰 443 并破坏 SSL。如果我选择另一个端口并为其添加端口转发,它工作正常......但这对于我需要的每个服务器路由来说都是不合理的,因为我的防火墙将变成瑞士奶酪。
因此,反向代理非常适合此目的。我只会打开 2 个端口:88这些444端口将连接到反向代理。在 Caddy 中,我可以轻松地在 Caddyfile 中设置目标端口:
// DNS points to the gateway's IP
mysubdomain.mydomain.com {
reverse_proxy {
to https://192.168.1.IP:443
transport http {
read_buffer 4096
}
{
}
Run Code Online (Sandbox Code Playgroud)
在我的第一次尝试中,我的 SSL 不起作用(感谢代理修改的标头),因此我查看了Caddy 反向代理标头文档,发现它们确实修改了 2 个标头:
X-Forwarded-For标头字段。X-Forwarded-Proto标头字段。我应该使用什么值,以便 Caddy 传递原始值,或者不添加任何内容?
这是我目前拥有的,我应该使用什么来确保 X-Forwarded 标头不被更改或添加?
mysubdomain.mydomain.com {
reverse_proxy {
to https://192.168.1.IP:443
transport http { …Run Code Online (Sandbox Code Playgroud) 我看到了这个问题,但它似乎对我不起作用。
目前(工作)情况是:
server {
listen 443 ssl;
server_name updates.example.com;
ssl_certificate fullchain.pem;
ssl_certificate_key privkey.pem;
location /update {
proxy_pass "http://localhost:5000";
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_send_timeout 60;
proxy_intercept_errors off;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Client-Subject $ssl_client_s_dn;
proxy_set_header X-Client-Cert $ssl_client_cert;
}
location / {
proxy_pass "http://localhost:5001";
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_send_timeout 60;
proxy_intercept_errors off;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header …Run Code Online (Sandbox Code Playgroud) 类似的问题之前在这里和这里被问过,但没有一个匹配或解决我遇到的问题。经过几个小时的拼命解决问题后,我找到了一个出乎意料但简单的解决方案,我想以问答的方式分享它。
一家公司有两台服务器:反向代理(Ubuntu 20.04 + Nginx 1.17)和上游应用程序服务器(也是 Ubuntu 20.04 + Nginx 1.17)。反向代理处理各种子域,例如通过使用proxy_passhttp://demo.example.com指令将它们映射到上游服务器的目录。http://12.12.12.12:8000/demo/
然后,客户端发出 HTTP 请求,其中路径指向目录,但没有尾部斜杠,例如http://demo.example.com/items。默认的 Nginx 行为是进行 301 重定向到相同的 URL,并添加尾部斜杠,例如位置文档http://demo.example.com/items/中所述。
如果 301 重定向发生在上游应用程序服务器,则正常行为是重定向位置路径变为http://12.12.12.12:8000/demo/items/. 这不是问题,因为默认情况下,反向代理将12.12.12.12:8000/demo/用原始主机替换部分内容,因此客户端会收到正确的 301 重定向到demo.example.com/items/. 这正是我所期望发生的事情。
但是,通过以下配置,客户端收到的重定向位置将变为http://demo.example.com:8000/demo/items/。反向代理似乎只部分重写了重定向 URL。
反向代理的站点配置:
server {
listen 80;
listen [::]:80;
index index.html index.htm;
server_name demo.example.com;
location / {
proxy_pass http://12.12.12.12:8000/demo/;
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_set_header X-Forwarded-Proto $scheme;
} …Run Code Online (Sandbox Code Playgroud)