我试图让nginx反向代理设置工作。 我有两个Web服务器设置,一个与Nginx,一个与Apache2。 我目前无法使用nginx服务器,所以这就是我现在正在尝试的所有,但我补充说,我最终尝试两个,以防万一,影响设置。
我有四台机器在这个设置。
1.客户机
192.168.0.5
Ubuntu 14.04桌面
2.反向代理服务器
192.168.0.10
nginx 1.4.6
Ubuntu 14.04服务器
3.服务器1
192.168.0.15
server1.mydomain.com
nginx 1.4.6
Ubuntu 14.04服务器
4.服务器2
192.168.0.20
server2.mydomain.com
的Apache2
Ubuntu 14.04服务器
在我的客户端机器上,我已经将我的主机文件设置为指向每个Web服务器的反向代理服务器,如下所示
/ etc / hosts在客户端192.168.0.5上127.0.0.1 localhost 192.168.0.10 server1.mydomain.com 192.168.0.10 server2.mydomain.com
我有SSL1和SERVER2的SSL证书,我把它放在反向代理服务器(192.168.0.10)。 我们将其称为server1.crt,server1.key和server2.crt,server2.key。
我相信我必须使用这样的证书进行设置:
client(192.168.0.5) ---https---> reverseProxy(192.168.0.10 holds ssl certs) ---http---> server1 or server2
我现在有两台服务器,http,我只需要修复192.168.0.10上的nginx反向代理设置。
这是我试过的东西,但它不正确的redirect。 再次,我想要一个https连接到反向代理服务器,然后在反向代理和服务器之间build立一个http连接。
/etc/nginx/nginx.conf
user www-data; worker_processes 4; pid /run/nginx.pid; events { worker_connections 768; # multi_accept on; } 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; include /etc/nginx/mime.types; default_type application/octet-stream; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; gzip_disable "msie6"; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; ## # nginx-naxsi config ## # Uncomment it if you installed nginx-naxsi ## #include /etc/nginx/naxsi_core.rules; ## # nginx-passenger config ## # Uncomment it if you installed nginx-passenger ## #passenger_root /usr; #passenger_ruby /usr/bin/ruby; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
在/ etc / nginx的/网站可用/默认
server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; root /usr/share/nginx/html; index index.html index.htm; # Make site accessible from http://localhost/ server_name localhost; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; # Uncomment to enable naxsi on this location # include /etc/nginx/naxsi.rules } server { listen 443; server_name server1.mydomain.com; ssl on; ssl_certificate /usr/local/nginx/conf/server1.crt; ssl_certificate_key /usr/local/nginx/conf/server1.key; ssl_session_cache shared:SSL:10m; ssl_session_timeout 5m; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES"; ssl_prefer_server_ciphers on; location / { proxy_pass http://192.168.0.15:80; proxy_set_header Host server1; proxy_redirect http:// https://; } }
我假设我的/etc/nginx/sites-available/default文件中有些东西是不正确的,但是我一直在阅读几个教程,这看起来非常接近。 这个设置显然只是用server1来做的,而忽略了server2,但是我认为如果我能得到一个工作,我可以根据需要添加其他的工作。 我发现了类似的问题,比如这个 ,但是我仍然无法使用单个服务器来获得这个configuration。
目前正在发生什么
目前,当我去到server1.mydomain.com,我得到了标准的“欢迎使用nginx!” (192.168.0.10)。 没有转发。
我靠近吗? 提前致谢
在尝试了Capile发布的解决scheme之后,我遇到了另一个问题(可能已经被一个拥有更多Web知识的人所期待)。
当我把/etc/nginx/sites-available/default文件改成这样的时候:
/ etc / nginx / sites-available / default (在反向代理上)
server { listen 80 default_server; listen 443 ssl default_server; server_name server1.mydomain.com; ssl on; ssl_certificate /usr/local/nginx/conf/server1.com.crt; ssl_certificate_key /usr/local/nginx/conf/server1.com.key; ssl_session_cache shared:SSL:10m; ssl_session_timeout 5m; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES"; ssl_prefer_server_ciphers on; location / { proxy_pass http://192.168.0.15:80; proxy_set_header Host server1; proxy_redirect http:// https://; } }
有了这个configuration,我得到了一个
400错误的请求
普通的HTTP请求被发送到HTTPS端口
我想也许我应该尝试https://server1.mydomain.com ,但只是旋转。
此外,我不介意使用两个服务器相同的SSL证书。 我不认为这会是一个问题。
首先,感谢所有的帮助。
我删除了ssl on; 按照Capile的build议,改变了proxy_redirect http:// https://; line to proxy_redirect http:// $scheme://; 如Richard Smith所build议的。
这解决了httpstream量的不良请求。 所以现在,如果我去http://server1.mydomain.com我成功redirect到该网站(雅!)
如果我尝试去https://server1.mydomain.com我也redirect,这是伟大的,但我得到一个无法连接错误。 如果反向代理将httpstream量转发到http,并将httpsstream量转发到https,这是有意义的,因为后端服务器没有httpsconfiguration。
我的目标是,如果我去http://server1.domain.com使用https连接到反向代理,然后使用http转发到后端服务器。 这似乎并没有发生…它看起来只是转发它没有使用https。
另一方面,如果我去https://server1.domain.com,它应该使用https连接到反向代理,然后使用http转发到后端服务器。
所以我从不需要从客户端到反向代理服务器的http连接。
卷发按预期行事。 当我curl的http或https网站,我得到这个:
curl -i https://server1.mydomain.com或curl -i http://server1.mydomain.com
HTTP/1.1 302 Found Server: nginx/1.4.6 (Ubuntu) Date: Thu, 21 Jan 2016 16:34:29 GMT Content-Type: text/html; charset=utf-8 Content-Length: 92 Connection: keep-alive Cache-Control: no-cache Location: http://test1/users/sign_in Set-Cookie: session=336e109ad711; path=/; expires=Thu, 28 Jan 2016 16:34:36 -0000; HttpOnly Status: 302 Found X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Request-Id: ad65f-f6ds204-9fs8d-bdsdfa43-df5583266sdf87 X-Runtime: 0.005358 X-Xss-Protection: 1; mode=block <html><body>You are being <a href="http://test1/users/sign_in">redirected</a>.</body></html>
所以,redirect肯定发生在任何一种types的连接上,但我不认为客户端和反向代理服务器之间的HTTPS连接的SSL证书是被使用的。
你很接近,但是没有configurationhttp的反向代理,只有https(在上面的设置中) – 所以它应该显示来自文档根目录的默认内容。 第一台服务器也缺乏结束} 。
您可以在同一个块中configurationhttp和https,只需在listen指令中使用ssl关键字(在ssl端口下,所以不需要设置ssl on指令):
server { listen 80 default_server; listen 443 ssl default_server; ... ssl_certificate /usr/local/nginx/conf/server1.crt; ssl_certificate_key /usr/local/nginx/conf/server1.key; ssl_session_cache shared:SSL:10m; ...
我必须警告说,在同一个IP中使用两个不同的SSL证书有一定的局限性和复杂性 – 这是因为它需要HTTP重新协商(因为在请求正确的主机之前请求需要使用证书进行encryption),因此您可能需要通过server块来分离证书。 为此,请使用更具体的IP listen :
server { listen 192.168.0.10:443 ssl; # for server1.mydomain.com ... server { listen 192.168.0.11:443 ssl; # for server2.mydomain.com ...
我还build议您使用Mozilla SSLconfiguration生成器来获得SSL安全性的最佳实践。
为了避免400错误,只需删除ssl on;指令ssl on; 并重新加载。 这是导致httpstream量需要SSL – 你已经指出在线上使用ssl: listen 443 ssl default_server; (这意味着在这个端口上打开ssl)。
其余的configuration是好的,但根据您的服务器响应,您可能需要调整代理设置。
首先,检查一下是否在客户端或服务器端:使用cURL访问它,或者在浏览器上打开Web开发者工具并检查networking:如果您的浏览器被redirect,您可能需要调整proxy_redirect ,甚至是一些stringreplace您的服务器响应。
用cURL这样检查:
curl -i http://server1.mydomain.com
如果您在回复中看到Location:标题,则需要微调代理设置(这取决于响应)。 例如,您可能正在以https访问它,然后您的代理转发为http,而您的后端服务器应用程序redirect到https(但是当响应通过代理时,它会返回到浏览器的http)。 有几种方法来修复它,通过使用proxy_set_header ,甚至调整你的后端服务器。
例如,你可以使用:
proxy_set_header X-Forwarded-Proto $scheme;
但是,无论你的后端http服务器或您的应用程序将需要正确理解这一点。
或者,如果没有redirect,但没有响应(或者在请求超时后没有网关响应 – 30秒),请检查您的后端服务器是否正确响应代理服务器。
另请注意,您的后端不需要http服务器,例如,您可以直接使用FastCGI服务器 – 这有时会导致更less的故障。
根据cURL响应,我看到configuration正在按预期工作 – 后端服务器响应请求您login。如果SSL证书不工作,您将无法curl -i https://server1.mydomain.com 。
前端(代理)和后端之间的通信仅通过http(请参阅proxy_pass指令)完成,通常也是这样(另一个encryption可能会增加不必要的开销)。
现在,如果您只想使用https,则有两种select:在后端configuration(使其转发到https :// test1 / users / sign_in)或使用不同的nginx设置, http:80服务器,并将其redirect到https:443。 就像这样(一定要删除下一个服务器块的listen 80 ):
server { listen 80 default; server_name _; return 301 https://$host$request_uri; } server { listen 443 ssl; ...
使用新的(EDIT1)configuration,使用http(而不是https)的任何对机器#2的访问都将被代理。 这就消除了原来的“欢迎使用nginx!” 副作用,这可能是由redirect到httpscheme造成的。
继续,我认为问题的根源是机器#3(真正的服务器1)生成一个redirect,这是不正确的映射到客户端的时间。
您可能需要检查机器#2和机器#3上的访问日志,以充分了解相互作用。 您可能需要调整日志格式以了解每个交互使用哪个scheme(http vs https)。
您可能需要暂时禁用proxy_redirect以便您可以在客户端使用开发人员工具来准确了解机器#3在http 3xx响应中发出的URL。
您的proxy_redirect指令对于EDIT1configuration是错误的,因为您现在正在代理这两个scheme,所以这可能更合适:
proxy_redirect http:// $scheme://
话虽如此,更具体的proxy_redirect可能是适当的。 正如文档所述,您可以使用多个proxy_redirect rules. I am not an expert on proxy_redirect rules. I am not an expert on proxy_redirect规则proxy_redirect rules. I am not an expert on ,但是你可能会得到这样的结果:
proxy_pass http://192.168.0.15; proxy_set_header Host server1; proxy_redirect http://192.168.0.15 $scheme:// proxy_redirect http://server1 $scheme://