我有两台服务器,一台是可以在我们公司的本地网络内部访问的开发服务器,另一台是面向公众的 Web 服务器。开发服务器托管了几个我们用来在内部管理项目的工具,但现在我们也需要在维护安全性的同时从外部访问它们。
我已经使用 ProxyPass 和 ProxyPassReverse 指令在外部服务器上设置了 mod_proxy 以将外部请求映射到内部服务器。我还在这些外部虚拟主机上设置了身份验证,以为外部访问提供安全性。我还需要使用 SSL 进行外部访问,但理想情况下更希望让内部工具可以通过普通 HTTP 访问内部网络中的人员。
是否有可能实现这种行为,如果可以,我应该使用哪些指令和 Apache 模块以及需要在哪些服务器上设置它们?
我正在尝试在 lighttpd 中设置一个反向代理,以便 /mobile/video 下的所有请求(并且只有那些请求)被重定向到辅助 Web 服务器的 / 目录。这在 apache 中很容易,但我一生都无法弄清楚如何在 lighttpd 中做到这一点。
$HTTP["url"] =~ "^/wsmobile/video/" {
url.rewrite-once = ( "^/wsmobile/video/(.+)" => "/$1" )
proxy.server = ( "" => ( ( "host" => "210.200.144.26", "port" => 9091 ) ) )
}
Run Code Online (Sandbox Code Playgroud)
我试过使用 http["url"] 指令,但是 lighttpd 只是忽略这些请求并继续将完整的 url 传递给辅助服务器,这当然会导致 404 阻塞和抛出。但是,如果我进行全局重写,那么所有内容都会转发到辅助服务器,这也不是我想要的。
我该如何完成这项任务?
我真的不知道...
我有一个 java web 应用程序,它将会话 id 存储在 URL 中,而不是使用 cookie。我想在 2 个 tomcat 服务器上运行该应用程序,并在它们前面使用 Apache 服务器进行负载平衡。
__ tomcat1
Apache ----/
\__ tomcat2
Run Code Online (Sandbox Code Playgroud)
通过在Tomcat文件中设置jvmRouteto ,url就会变成. 所以可以通过查看url来实现会话粘性,并将其路由到相应的服务器。tomcat1server.xmlhttp://url;jsessionid=id.tomcat1
我知道,mod_proxy和mod_jk做负载均衡,但他们的粘性会话只有工作当会话ID存储在cookie中。就我而言,会话 ID 编码在 URL 中。如何进行负载平衡?
目前我有一个应用程序在 8080 上运行,由 mod_proxy 前端。
<Location /hudson>
Order allow,deny
Allow from all
ProxyPass http://localhost:8080/hudson
ProxyPassReverse http://localhost:8080/hudson
</Location>
Run Code Online (Sandbox Code Playgroud)
我需要阻止 TCP 8080 但不需要阻止本地主机如何使用 IPtables 来完成?
我正在尝试为通过 SSL 运行 tomcat 嵌入服务器的应用程序设置反向代理。该应用程序需要在端口 9002 上通过 SSL 运行,因此我无法为此应用程序“禁用 SSL”。当前的设置架构如下所示:
[192.168.0.10:443 - Apache with mod_proxy] --> [192.168.0.10:9002 - Tomcat App]
Run Code Online (Sandbox Code Playgroud)
在谷歌搜索如何进行这样的设置(和测试)之后,我遇到了这个:
https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/861137
这导致我当前的配置(尝试模拟 wget 的 --secure-protocol=sslv3 选项)
/etc/apache2/sites/enabled/default-ssl:
<VirtualHost _default_:443>
SSLEngine On
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
SSLProxyEngine On
SSLProxyProtocol SSLv3
SSLProxyCipherSuite SSLv3
ProxyPass /test/ https://192.168.0.10:9002/
ProxyPassReverse /test/ https://192.168.0.10:9002/
LogLevel debug
ErrorLog /var/log/apache2/error-ssl.log
CustomLog /var/log/apache2/access-ssl.log combined
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
问题是错误日志显示错误:14077102:SSL 例程:SSL23_GET_SERVER_HELLO:不支持的协议
完整的请求日志:
[Wed Mar 13 20:05:57 2013] [debug] mod_proxy.c(1020): Running scheme https handler (attempt 0)
[Wed Mar 13 20:05:57 2013] [debug] mod_proxy_http.c(1973): proxy: …Run Code Online (Sandbox Code Playgroud) 我的服务器上有多个 django 应用程序,每个应用程序都在自己的虚拟主机中运行,绑定到不同的端口。(我这样做是为了隔离每个 WSGIProcessGroup)。
现在,为了简单起见,我想将每个应用程序代理到端口 80。
对于一个应用程序,我做这样的事情:
Listen 8101
<VirtualHost 127.0.0.1:8101>
WSGIProcessGroup app1
WSGIDaemonProcess app1 display-name=%{GROUP}
WSGIScriptAlias /app1 "/var/django_apps/app1/app1.wsgi"
</VirtualHost>
<VirtualHost *:80>
ProxyPass /app1 http://localhost:8101/app1
ProxyPassReverse /app1 http://localhost:8101/app1
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
现在,为了简单地启用或禁用某些应用程序,当我运行另一个应用程序时,我有另一个 .conf 文件包含以下内容:
Listen 8102
<VirtualHost 127.0.0.1:8102>
WSGIProcessGroup app2
WSGIDaemonProcess app2 display-name=%{GROUP}
WSGIScriptAlias /app2 "/var/django_apps/app2/app2.wsgi"
</VirtualHost>
<VirtualHost *:80>
ProxyPass /app2 http://localhost:8102/app2
ProxyPassReverse /app2 http://localhost:8102/app2
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
但是这第二个<VirtualHost *:80>没有使用,考虑到 apache 配置语法,这似乎很正常。
但是,我希望将这一点配置放在应用程序声明的旁边,这样我就可以将属于一起的内容放在一个文件中。
有什么我可以做的吗?我正在考虑以某种方式使用 include 指令,但我对 apache 配置知之甚少,而且我认为我无法自己找到解决方案:)
你怎么认为?
干杯
我见过这个例子:
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ balancer://app_cluster%{REQUEST_URI} [P,QSA,L]
Run Code Online (Sandbox Code Playgroud)
我需要一个类似的东西,当静态文件不存在时,它将委托给 mod_proxy(即做一个 ProxyPass)。可行吗?
我有一台frontend.example.com带有公共 IP的服务器。Apache (2.4) 应该代理service1.example.com(DNS 别名为frontend.example.com)的流量。
service1.example.com是位于192.168.56.0两者之间的专用 LAN ( )上的 VM 。
现在,这对 HTTP 来说很容易:
<VirtualHost *:80>
ServerName service1.example.com
ProxyPass / http://192.168.56.2/
ProxyPassReverse / http://192.168.56.2/
<Location "/">
Require all granted
</Location>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
我正在尝试为 HTTPS 做同样的事情:
<VirtualHost *:443>
ServerName service1.example.com
SSLEngine On
SSLProxyEngine On
ProxyRequests Off
SSLProxyCheckPeerCN off
SSLProxyCheckPeerExpire off
SSLInsecureRenegotiation on
SSLProxyVerify none
SSLVerifyClient none
SSLCertificateFile /etc/ssl/certs/example_com.crt
SSLCertificateKeyFile /etc/ssl/certs/example_com.key
ProxyPass / https://192.168.56.2/
ProxyPassReverse / https://192.168.56.2/
<Location "/">
Require all granted
</Location>
</VirtualHost> …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)
如果我重试该请求,它通常会立即起作用,尽管有时我必须刷新几次才能满足请求。我注意到,当发出大批量请求时(即包含数百个外部资源的页面),这种情况会更频繁地发生。我还注意到,这种情况似乎发生在较大的文件上,而不是较小的文件上。
我猜测这可能是某种超时,但我不确定要调整哪些值或如何进一步调试它。
我尝试过的事情包括以下内容:
今天我在我的日志文件中注意到了这个条目:
Connection attempts using mod_proxy:
175.180.113.83 -> 66.135.210.61:80: 1 Time(s)
Run Code Online (Sandbox Code Playgroud)
这是我通常在日志中看不到的内容。我对此有几个问题:
编辑:看起来 66.135.210.61 属于 eBay,另一个 IP 属于台湾的某个人。这是否意味着有人通过 eBay 访问了我的服务器?eBay 的安全性不应该足以防止此类事情发生吗?
谢谢
mod-proxy ×10
apache-2.2 ×5
mod-ssl ×3
apache-2.4 ×2
django ×1
hudson ×1
lighttpd ×1
logging ×1
logwatch ×1
mod-jk ×1
mod-rewrite ×1
proxy ×1
rewrite ×1
tomcat ×1
url ×1
varnish ×1
virtualhost ×1