需要澄清 nginx 反向代理服务器上的上游 SSL
我一直在阅读有关反向代理和保护与上游服务器的 ssl 连接的nginx 文档,但我仍然对哪些 ssl 证书去哪里感到困惑。我发现的许多示例都有 nginx 代理本地主机,但我的情况是端点位于不同的服务器、端口和物理位置。
我想在 nginx 服务器上解析多个域。每个域在其当前服务器上都有一个用于其实际域名的 ssl 证书。
现在,我的每台服务器都在其自己的网络位置和物理位置上运行,但我希望有一个点来管理这些端点。
我的最终结果应该是这样的
client
|
nginx
https://example1.com
https://example2.com
https://example3.com
x.x.x.x
|
-----------------------------------------
| | |
https://example1.com https://example2.com https://example3.com
a.b.c.d:1234 e.f.g.h:5678 i.j.k.l:9012
Run Code Online (Sandbox Code Playgroud)
现在https://example1.com解析为 abcd:1234,它安装了自己的 ssl 证书。因为我需要向客户端表示 nginx 服务器正在为域 example1.com 提供服务,所以我认为我需要将 example1.com ssl 移至前端运行的 nginx 服务器,对吧?如果我这样做,我应该在 abcd:1234 上使用什么 ssl 证书来维护安全的上游连接?
nginx 文档说 client.crt 和 server.crt,但 CA 使用域来注册它们。反向代理情况下的客户端和服务器是什么?对我来说,客户端是发出请求的浏览器。
哪些 ssl 证书位于反向代理上的哪个位置?
编辑:
我已经知道,只需将基于 url 的证书放在代理服务器上,您就可以看起来拥有安全连接。我希望知道的是要在后端服务器上放置哪些 ssl 证书。只是重复使用各自的证书吗?example1.com.crt代理服务器和后端服务器都可以吗?
有一种情况,首先所有当前请求都应该像它们当前针对某个域名一样工作。例如 www.hello.com
一动态DNS是要指向www.hello.com服务器相同的静态IP(somedomain.dnsdynamic.com ---> XXX.XXX.XXX.XXX)
所有请求,包括 GET、POST 等,都将被代理到主机名为 finalserver.example.com 的另一台服务器。(注意这个服务器没有静态ip,所以必须使用主机名)
代理应该只在 www.hello.com 服务器收到服务器名称为 somedomain.dnsdynamic.com 的请求时工作
已经尝试记住这个答案但失败了,要么得到 502 bad gateway 要么 404 page not found
我在单个 IP 地址上运行 Proxmox 服务器,它将根据请求的主机向容器发送 HTTP 请求。
我在 Proxmox 端使用 nginx 来监听 HTTP 请求,我proxy_pass在不同server块中使用指令根据server_name.
我的容器在 Ubuntu 上运行,同时也在运行一个 nginx 实例。
我在完全静态的特定网站上缓存时遇到问题:在文件更新后,nginx 继续为我提供陈旧的内容,直到我:
proxy_cache off为此服务器设置并重新加载配置这是我的配置的详细信息:
在服务器上(proxmox):
/etc/nginx/nginx.conf:
user www-data;
worker_processes 8;
pid /var/run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
use epoll;
}
http {
##
# Basic Settings
##
sendfile on;
#tcp_nopush on;
tcp_nodelay on;
#keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off; …Run Code Online (Sandbox Code Playgroud) 我正在尝试设置一个反向代理,以只允许几个选定的 ip 范围代理到内部主机,而我希望不在 ip 范围内的任何其他人重定向到我们的内部命名主机。在此设置中,网络服务将正常工作,而没有通过 VPN 连接到我们网络的任何人都无法导航到内部资源。我一直试图让它在没有运气的情况下工作,我的部分配置目前如下:
ProxyRequests Off
<Proxy *>
Allow from all
</Proxy>
<Location />
Allow From xxx.xxx.xxx.xxx/24 1xxx.xxx.xxx.xxx/23
Deny From All
ProxyPass http://server.local.corp:8000/
ProxyPassReverse http://server.local.corp:8000/
</Location>
Run Code Online (Sandbox Code Playgroud)
此配置似乎可以很好地阻止其他 ip 范围进行代理,但是我不清楚如何为其他人添加重定向语句。
编辑 从第一个答案中获取建议我的代码现在看起来像:
<If "%{REMOTE_ADDR} -ipmatch 'xxx.xxx.xxx.xxx/24'">
ProxyPass / http://server.local.corp:8000/
ProxyPassReverse / http://server.local.corp:8000/
</If>
Run Code Online (Sandbox Code Playgroud)
并且 apache 在重启时抛出以下错误:
ProxyPass cannot occur within <If> section
Action 'configtest' failed.
The Apache error log may have more information.
Run Code Online (Sandbox Code Playgroud) 首先是一些背景:我们有一个嵌入式设备,可以将许多小事件上传到 Web 服务器。分块编码用于发布此信息。每个事件都作为一个单独的块发送,因此网络服务器 (node.js) 可以立即对事件做出反应。所有这一切都像一种魅力。
禁用服务器并在服务器上运行 netcat 显示设备发送的内容:
sudo nc -l 8080
POST /embedded_endpoint/ HTTP/1.1
Host: url.com
User-Agent: spot/33-dirty
Transfer-Encoding: chunked
Accept: text/x-events
Content-Type: text/x-events
Cache-Control: no-cache
120
{"some","json message"}
232
{"other","json event"}
232
{"and a lot more","up to 150 messages per second!"}
0
Run Code Online (Sandbox Code Playgroud)
现在我在我的网络服务器上安装了 nginx(版本 1.6.0)。最后我希望它处理 SSL 并且我想处理加速正常的网络流量。
如果我现在使用此服务器配置启用 nginx:
server {
listen 8080;
location / {
proxy_http_version 1.1;
expires off;
proxy_buffering off;
chunked_transfer_encoding on;
proxy_pass http://localhost:5000;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我收到这个:
sudo nc -l 8080
POST /embedded_endpoint/ HTTP/1.1
Host: localhost:5000 …Run Code Online (Sandbox Code Playgroud) 我们的组织正在改造它的网站。有人在新服务器上建立了新站点。将条目放入 /etc/hosts 后即可访问它。并且以这种方式访问时可以完美运行。
但是由于涉及的大多数人都不擅长计算机,因此我决定设置反向代理。
我无权访问该站点,也无权托管它的服务器。我在那里安装了 Wordpress 的编辑器帐户。
我在我的私人服务器的 /etc/hosts 中放置了一个条目并使用以下配置设置反向代理,我的服务器在 Debian stable 下运行 apache-2.2:
<VirtualHost *:80>
ServerName xxx.xxx.xxx.xxx
ProxyRequests off
ProxyPass /some/prefix/ http://site.example.com/
ProxyPassReverse /some/prefix/ http://site.example.com/
ProxyHTMLURLMap http://site.example.com/ http://xxx.xxx.xxx.xxx/some/prefix/
<Location /some/prefix/>
SetOutputFilter INFLATE;proxy-html;DEFLATE
ProxyHTMLURLMap http://site.example.com/ /some/prefix/
</Location>
ProxyPassReverseCookieDomain site.example.com xxx.xxx.xxx.xxx
ProxyPassReverseCookiePath / /some/prefix/
ProxyHTMLExtended On
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
几乎一切正常。我无法发布新帖子(文本编辑器未正确加载)。Iceweasel 的 (Firefox) 开发者模式说:
(...)
[00:13:33.365] GET http://xxx.xxx.xxx.xxx/some/prefix/wp-includes/js/tinymce/langs/pl.js?wp-mce-4107-20141130 [HTTP/1.1 404 Not Found 399ms]
(...)
[00:13:33.648] Failed to load: http://xxx.xxx.xxx.xxx/some/prefix/wp-includes/js/tinymce/langs/pl.js
[00:13:46.733] POST http://xxx.xxx.xxx.xxx/wp-admin/admin-ajax.php [HTTP/1.1 404 Not Found 102ms]
Run Code Online (Sandbox Code Playgroud)
我省略了非错误。在我看来,Apache 并没有重写某些东西。有任何想法吗?
我正在尝试在 centos 7 虚拟机上使用 nginx 作为负载平衡器来替换老化的 Coyote Point 硬件设备。但是,在我们的一个 web 应用程序中,我们在日志中看到频繁且持续的上游超时错误,并且客户端在使用系统时报告会话问题。
这是我们 nginx.conf 中的相关部分
user nginx;
worker_processes 4;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
upstream farm {
ip_hash;
server www1.domain.com:8080;
server www2.domain.com:8080 down;
server www3.domain.com:8080;
server www4.domain.com:8080;
}
server {
listen 192.168.1.87:80;
server_name host.domain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 192.168.1.87:443 ssl;
server_name host.domain.com;
## Compression
gzip on;
gzip_buffers 16 8k;
gzip_comp_level 4;
gzip_http_version 1.0;
gzip_min_length 1280;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript …Run Code Online (Sandbox Code Playgroud) 假设我在 IIS 前将 Nginx 设置为反向代理,并在 Nginx 上为浏览器启用 HTTP/2 支持。
我会看到任何好处吗?
我的代理缓存路径设置为非常高的大小
proxy_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=staticfilecache:180m max_size=700m;
Run Code Online (Sandbox Code Playgroud)
并且使用的大小仅为
sudo du -sh *
14M cache
4.0K proxy
Run Code Online (Sandbox Code Playgroud)
代理缓存有效设置为
proxy_cache_valid 200 120d;
Run Code Online (Sandbox Code Playgroud)
我通过以下方式跟踪 HIT 和 MISS
add_header X-Cache-Status $upstream_cache_status;
Run Code Online (Sandbox Code Playgroud)
尽管有这些设置,我还是看到了很多未命中。这是我在一小时前故意运行缓存预热器的页面。
我如何调试这些 MISS 发生的原因?我如何确定未命中是否是由于驱逐、到期、某些流氓头球等造成的?Nginx 是否为此提供命令?
编辑:完整配置
# at http level
proxy_cache_path /var/lib/nginx/cache levels=1:2 inactive=400d keys_zone=staticfilecache:180m max_size=700m;
proxy_temp_path /var/lib/nginx/proxy;
proxy_connect_timeout 30;
proxy_read_timeout 120;
proxy_send_timeout 120;
#prevent header too large errors
proxy_buffers 256 16k;
proxy_buffer_size 32k;
#httpoxy exploit protection
proxy_set_header Proxy "";
# at server level
add_header Cache-BYPASS-Reason $skip_reason;
# define nginx variables …Run Code Online (Sandbox Code Playgroud) 我正在运行一个 HTTP 服务并希望将nginxSSL 终止放在前面。这可以通过两种方式完成;要么作为stream代理
stream {
server {
listen 443 ssl;
ssl_certificate /certs/fullchain.pem;
ssl_certificate_key /certs/privkey.pem;
proxy_pass ip-for-backend-service:80;
}
}
Run Code Online (Sandbox Code Playgroud)
或作为http代理
http {
server {
listen 443 ssl;
ssl_certificate /certs/fullchain.pem;
ssl_certificate_key /certs/privkey.pem;
location / {
proxy_pass http://ip-for-backend-service:80;
proxy_set_header ...;
}
}
}
Run Code Online (Sandbox Code Playgroud)
乍一看,stream代理的配置似乎要简单得多,因为您不必添加一堆额外的标头(proxy_set_header等)和其他配置。
我试图了解这两种方法之间的优缺点,特别是我有以下问题:
这两种方法是否会泄漏有关后端服务的更多信息?例如,是否ip-for-backend-service可见?
这两种方法都能更好地抵御攻击吗?我想如果后端服务有缺陷,它会通过这两个选项可见/可利用吗?
哪个选项更有效?我认为该stream选项可能会更快,因为它只是路由流量并且中间没有 http 服务器?
reverse-proxy ×10
nginx ×7
cache ×2
apache-2.2 ×1
apache-2.4 ×1
chunked ×1
http ×1
http2 ×1
proxy ×1
request ×1
ssl ×1
wordpress ×1