我一直在使用Nginx 0.8.5作为缓存反向代理来构建一个类似自定义cdn的解决方案,以加快我们网站的加载时间.到目前为止它工作得很好,除非高速缓存失效真的很复杂,即使安装了高速缓存清除模块也是如此.
例如,有时我们可能需要一次使100个URL无效,这需要100个不同的请求才能发送到每个缓存反向代理服务器.
这几乎不适用于设置的两个缓存服务器,我们的计划是扩展到20台服务器,因此我们需要找到更好的解决方案.有任何想法吗?
简单地重新配置Nginx是行不通的,我确信我们需要自定义代码.我们不想参与自定义Nginx模块开发.
我已经设法在config.ru中设置了我的heroku应用程序的反向代理
require ::File.expand_path('../config/environment', __FILE__)
use Rack::ReverseProxy do
reverse_proxy /^\/blog(.*)$/, 'http://blog.domain.com$1', opts={:preserve_host => true}
end
run Appname::Application
Run Code Online (Sandbox Code Playgroud)
这允许我的heroku应用程序在domain.com上运行,并且当wordpress网站提供blog.domain.com时,domain.com/blog显示为URL.到目前为止很棒.
wordpress网站在访问domain.com/blog时得到了正确的服务,但是当我进入任何更深层次的页面时,如单个帖子wordpress会引发错误.我在表格的网址中使用了包含日期和标题的永久链接:domian.com/blog/2012/07/a-great-blog-post - Worpress现在似乎不喜欢这样.当我将链接切换回表单domain.com/blog/?p=4时,页面成功提供.
在inial domain.com/blog正确之后,它似乎无法处理和排序斜杠.我觉得奇怪的是domain.com/blog/wp-admin(和整个WP管理应用程序)工作没有任何打嗝.
任何人都可以看到任何明显的问题为什么带有多个斜杠'/'的页面/帖子可能会导致问题?
提前致谢!
我有客户端:C,服务器:S(例如在端口7000上的本地ip 10.0.0.1上)和Web服务器:W(例如在www.example.com上)
C想通过Web路径联系S:http://www.example.com/path_for_server_S
所以W充当前向代理
现在S将通过相同的路径联系C:http://www.example.com/path_for_server_S
所以现在W充当反向代理
然后在Apache中,这将是一个常见的配置,如下所示:
ProxyPass /path_for_server_S http://10.0.0.1:7000
ProxyPassReverse /path_for_server_S http://10.0.0.1:7000
Run Code Online (Sandbox Code Playgroud)
已经有内置Web服务器的Play Framework可以处理这种情况吗?
搜索了很多,没事发现:)
我有一个处理PHP请求的nginx服务器,但它被配置为侦听非标准端口(端口12345或其他东西).我无法改变监听端口,因为企业IT部门说"不"
数据中心有一个代理服务器将来自www.domain.com:80的请求转发到端口12345上的nginx框.
我有一些静态的301重定向,我需要将其放置到位,但我会遇到意想不到的行为.
示例重定向在site.conf"server {}"块中:
rewrite ^/foo$ /bar/foo/ permanent;
Run Code Online (Sandbox Code Playgroud)
当我尝试访问www.domain.com/foo时,会发生重定向,但它会尝试将浏览器转发到www.domain.com:12345/bar/foo/
我的问题是,如何让nginx将用户重定向到正确的端口(www.domain.com/bar/foo/)?
也许更好的问题是,做我要问的正确方法是什么?有50多个重定向需要进入,我宁愿不为每个重定向创建一个"位置"部分.
我使用这个代码我想创建代理,所有应用程序调用端口3000将被"引导"到端口3002
var http = require('http'),
httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer();
http.createServer(function (req, res) {
proxy.web(req, res, {
target: 'http://localhost:3002'
});
}).listen(3000);
// Create target server
http.createServer(function (req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('request successfully proxied to: ' + req.url + '\n' + JSON.stringify(req.headers, true, 2));
res.end();
}).listen(3002);
Run Code Online (Sandbox Code Playgroud)
现在,当我使用原始端口(3000)运行应用程序时,我在浏览器中看到了
请求成功代理到3002
当我将端口(在浏览器中)更改为3002时,我仍然收到 相同的消息,为什么?好吗?
我应该在第二个创建服务器中生产什么?我的意思是代替
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('request successfully proxied to: ' + req.url + '\n' + JSON.stringify(req.headers, true, …Run Code Online (Sandbox Code Playgroud)在我的apache服务器后面配置keycloak有问题,
混合内容:" https://dev.mydomain.com/auth/admin/master/console/ " 页面是通过HTTPS加载的,但请求了一个不安全的脚本" http://dev.mydomain.com/auth/resources /1.7.0.final/admin/keycloak/js/controllers/groups.js '.此请求已被阻止; 内容必须通过HTTPS提供.
我的apache配置是,
ServerName dev.mydomain.com
ServerAdmin dev@mydomain.com
SSLEngine on
SSLCertificateFile /opt/mydomain/domains/dev.mydomain.com/apache/dev.mydomain.com.crt
SSLCertificateKeyFile /opt/mydomain/domains/dev.mydomain.com/apache/dev.mydomain.com.key
SSLCertificateChainFile /opt/mydomain/domains/dev.mydomain.com/apache/dev.mydomain.com.ca-bundle
DocumentRoot /opt/mydomain/domains/dev.mydomain.com/apache/htdocs
<Directory /opt/mydomain/domains/dev.mydomain.com/apache/htdocs>
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
Require all granted
</Directory>
ProxyRequests Off
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
<Proxy https://dev.mydomain.com/* >
Order deny,allow
Deny from all
Allow from all
</Proxy>
ProxyPass /auth http://localhost:10082/auth nocanon
ProxyPassReverse /auth http://localhost:10082/auth
Run Code Online (Sandbox Code Playgroud)
知道什么是错的吗?
我在artfactory中为docker存储库配置了以下nginx
server {
listen 2222 ssl;
server_name rproxy.company.com;
if ($http_x_forwarded_proto = '') {
set $http_x_forwarded_proto $scheme;
}
rewrite ^/(v1|v2)/(.*) /artifactory/api/docker/docker-dev/$1/$2;
client_max_body_size 0;
chunked_transfer_encoding on;
location / {
allow all;
proxy_read_timeout 900;
proxy_pass_header Server;
proxy_cookie_path ~*^/.* /;
proxy_set_header X-Artifactory-Override-Base-Url $http_x_forwarded_proto://$host:$server_port;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://artifactory_lb;
}
Run Code Online (Sandbox Code Playgroud)
但是docker登录rproxy.compan.com:2222返回404
这是此请求的访问日志
"GET /api/docker/docker-dev/v2/token?account=myUsre&client_id=docker&offline_token=true&service=rproxy.company.com%3A2222 HTTP/1.1"404 473" - ""docker/1.11.0 go/go1.5.4 git-commit/4dc5990 kernel/3.13.0-24-generic os/linux arch/amd64 UpstreamClient(Docker-Client/1.11.0\x5C(linux\x5C))"
该命令curl -umyUser:myPass "https://rproxy.company.com:2222/v2/auth"
返回正确的身份验证令牌
我也使用Docker版本1.11和Artifactory版本4.60.任何指向我可能缺少的东西?
是否还需要从docker reositories的Web界面配置反向代理?
我们有一个java web服务器,可以通过h2c(HTTP/2明文)提供内容
我们希望将使用h2(即SSL上的标准HTTP/2)建立的代理连接反向到h2c中的java服务器.
在nginx上启用HTTP/2非常简单,处理传入的h2连接工作正常.
我们如何告诉nginx使用h2c代替连接而不是http/1.1?
注意:非nginx解决方案可能是可以接受的
server {
listen 443 ssl http2 default_server;
server_name localhost;
ssl_certificate /opt/nginx/certificates/???.pem;
ssl_certificate_key /opt/nginx/certificates/???.pk8.key.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://localhost:8080/; ## <---- h2c here rather than http/1.1
}
}
Run Code Online (Sandbox Code Playgroud)
结论 (2016年6月)
这可以使用haproxy使用配置文件来完成,如下所示.
查询(HttpServletRequest) req.getProtocol()清楚回报HTTP/2.0
global
tune.ssl.default-dh-param 1024
defaults
timeout connect 10000ms
timeout client 60000ms
timeout server 60000ms
frontend fe_http
mode http
bind *:80
# Redirect to https
redirect scheme https code 301
frontend fe_https
mode …Run Code Online (Sandbox Code Playgroud) 所以我使用以下设置为网站创建一个反向代理,如下所示.
server {
listen 80;
server_name mysite.com;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
root /home/ubuntu/p3;
location / {
proxy_pass https://mysiter.com/;
proxy_redirect https://mysiter.com/ $host;
proxy_set_header Accept-Encoding "";
}
}
Run Code Online (Sandbox Code Playgroud)
但得到BAD GATE WAY 502错误,以下是日志.
2016/08/13 09:42:28 [error] 26809#0: *60 SSL_do_handshake() failed (SSL: error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error) while SSL handshaking to upstream, client: 103.255.5.68, server: mysite.com, request: "GET / HTTP/1.1", upstream: "https://105.27.188.213:443/", host: "mysite.com"
2016/08/13 09:42:28 [error] 26809#0: *60 SSL_do_handshake() failed (SSL: error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error) while SSL handshaking to upstream, client: 103.255.5.68, …Run Code Online (Sandbox Code Playgroud) 我有一个使用traefik的反向代理设置。这很棒!
我试图弄清楚如何配置它,以便当有人访问HOSTNAME或www.HOSTNAME时,我可以将它默认路由到我选择的某个容器/子域。假定有效的DNS记录。
我在这里有一个配置toml文件。然后,我启动一堆容器,docker后端会监视并拾取这些容器。例如,
static:
image: myrepo/static
volumes:
- /www/static:/www/static
depends_on:
- traefik
labels:
- "traefik.backend=static"
- "traefik.frontend.rule=Host:static.$HOSTNAME"
Run Code Online (Sandbox Code Playgroud)
浏览可static.HOSTNAME立即使用。雅虎!但是假设我要浏览HOSTNAME也可以static.HOSTNAME。
任何提示都很棒!谢谢。