让Apache2.4和Tomcat在WindowsServer上协同工作

目的

到目前为止,我已经用Apache 2.2系列+ OpenSSL构建了一个可以与Tomcat一起使用的Web服务器,但是需要将Apache更改为2.4系列+ OpenSSL 1.1.0,所以我主要研究了Apache配置文件。我是。

你想做的事

  • 将来自客户端的请求转发到 Tomcat。
  • 静态内容(图像、css、js)应该由 Apache 返回,而不是传输到 Tomcat。
  • 去掉第一次访问时添加到URL中的jsessionid=xxx,然后传输。
  • 必须能够与 SSL 连接

什么不能做

  • 負荷分散

环境

  • 操作系统:Windows Server 2012 R2
  • Apache:2.4.27 + OpenSSL 1.1.0 使用Apache Lounge1
  • 雄猫:7.0.40

Apache Lounge 二进制文件使用 VisualStudio2017 编译。要使用它,请提前安装 VC15 的 C++ 可再发行包。您可以从上面的 Apache Lounge 链接下载它

将请求从客户端转发到 Tomcat

启用 mod_proxy 并转发到具有代理功能的 tomcat。
关于Apache和Tomcat的连接协议,一般使用mod_proxy_ajp或者mod_jk,但是这次使用的是mod_proxy_http。2

httpd.conf
# 以下の#を除去してモジュールを有効にします。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

# 以下のようにProxyPassを追加し、Tomcat(port:8080)へ転送します
ProxyPass /app http://localhost:8080/app
ProxyPassReverse /app http://localhost:8080/app

静态内容(图像、css、js)由 Apache 返回而不传输到 Tomcat

如下图将静态内容放在apache安装文件夹下,这样就不会传输到Tomcat了。

Apache24
└ htdocs
  └ app
     ├ images
     ├ jss
     └ styles
httpd.conf
# 以下のようにProxyPassを追加し転送しないようにします。(転送設定よりも前に記述することで有効になります。)
ProxyPass /app/images !
ProxyPass /app/jss !
ProxyPass /app/styles !
ProxyPass /app http://localhost:8080/app
ProxyPassReverse /app http://localhost:8080/app

去掉第一次访问时加在URL中的jsessionid=xxx,转入

jsessionidjsessionid 使用 mod_rewrite 模块删除,因为如果请求 URL 具有.

httpd.conf
# 以下の#を除去してモジュールを有効にします。
LoadModule rewrite_module modules/mod_rewrite.so

# 以下のようにrewite定義を追記します。(proxyPassの前でも後でも大丈夫なようです)
RewriteEngine On
RewriteRule ^(.*);jsessionid=(.*)$ $1 [R,L]

ProxyPass /app/images !
ProxyPass /app/jss !
ProxyPass /app/styles !
ProxyPass /app http://localhost:8080/app
ProxyPassReverse /app http://localhost:8080/app

使用 SSL 连接

SSL证书存放目录

Apache24  
└ conf
  └ ssl

私钥的注意事项

  • 私钥的位长为 2048 位。
  • 不要设置密码。因为您需要在 Apache 启动时输入密码。
    由于目前取消了密码,所以最初没有设置。
    既然是私钥,只要不从服务器泄露,应该是安全的。

SSL 服务器证书设置

①将
set OPENSSL_CONF=E:/Apache24/conf/openssl.cnf
OpenSSL配置文件定义为环境变量。

② 创建加密密钥和 CSR
openssl req -nodes -new -newkey rsa:2048 -keyout ../conf/ssl/server.YYYY.key -out ../conf/ssl/server.YYYY.csr

(3) 获取服务器证书
在生产中,我们会有一个CA颁发它,但是这次我们准备了一个自我证书。
openssl x509 -in ../conf/ssl/server.YYYY.csr -days 365 -req -signkey ../conf/ssl/server.YYYY.key -out ../conf/ssl/server.YYYY.crt

httpd-ssl.conf 设置

  • 我已经定义了创建的加密密钥和服务器证书。
  • 执行日志轮换 (error.log/access.log/ssl_request.log)
  • 定义一个反向代理以使用 http 转发到 Tomcat。(在 Apache 和 Tomcat 之间使用 http。)

证书注意事项
到目前为止,中间证书已经定义在 SSLCertificateChainFile 中,但从现在开始,将在 SSLCertificateFile 中创建和定义连接服务器证书和中间证书的文件。(未确认)

httpd-ssl.conf
<VirtualHost _default_:443>
DocumentRoot "E:/Apache24/htdocs"
#ServerName www.example.com:443
#ServerAdmin admin@example.com

# ログファイルローテーション
#ErrorLog "E:/Apache24/logs/error.log"
ErrorLog "|bin/rotatelogs.exe logs/ssl_error_%Y%m%d.log 86400 540"
#TransferLog "E:/Apache24/logs/access.log"
CustomLog "|bin/rotatelogs.exe logs/ssl_access_%Y%m%d.log 86400 540" common

SSLEngine on

# サーバー証明書と秘密鍵のパスを定義します
SSLCertificateFile "E:/Apache24/conf/ssl/server_2017.crt"
SSLCertificateKeyFile "E:/Apache24/conf/ssl/server.2017.key"

<FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</FilesMatch>
<Directory "E:/Apache24/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

BrowserMatch "MSIE [2-5]" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0
#CustomLog "E:/Apache24/logs/ssl_request.log" \
#          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
CustomLog "|bin/rotatelogs.exe logs/ssl_request_%Y%m%d.log 86400 540" \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"


RewriteEngine On
RewriteRule ^(.*);jsessionid=(.*)$ $1 [R,L]

# リバースプロキシを設定してTomcatへ転送します。
SSLProxyEngine on
ProxyPass /app/images !
ProxyPass /app/jss !
ProxyPass /app/styles !
ProxyPass /app http://localhost:8080/app
ProxyPassReverse /app http://localhost:8080/app

</VirtualHost>

为 Apache 启用 SSL

我必须启用 mod_socache_shmcb.so 模块以及旧版 mod_ssl.so。

httpd.conf
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so

将请求从 http(80) 重定向到 https(443)

现在我启用了 SSL,我将其更改为将来自客户端的 http 请求重定向到 https。

httpd.conf
#ewriteEngine On
#RewriteRule ^(.*);jsessionid=(.*)$ $1 [R,L]

#ProxyPass /app/images !
#ProxyPass /app/jss !
#ProxyPass /app/styles !
#ProxyPass /app http://localhost:8080/app
#ProxyPassReverse /app http://localhost:8080/app

#httpでのリバースプロキシはやめ、httpsでリダイレクトするように変更しました。
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

其他设置

禁用 mod_access_compat

Apache2.4 系列不再提供用于访问控制的 Allow 指令和 Deny 指令。
据说如果启用了这个模块就可以使用这个指令,但是由于当前的Web服务器一开始没有定义Allow或Deny,所以我暂时禁用了它。

httpd.conf
# 以下に#を追加してモジュールを無効にします。
#LoadModule access_compat_module modules/mod_access_compat.so

禁用 htdocs 索引

在您的应用程序中禁用 htdocs 的目录列表。

httpd.conf
<Directory "E:/Apache24/htdocs">
    # 以下のOptionsのIndexesに(-)を付けて無効にします。FollowSymLinksは有効にするため(+)を付けます。
    Options -Indexes +FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

日志轮换

默认情况下,Access.log 和 error.log 是不旋转的,所以使用 rotatelogs.exe 按日期输出日志文件。
* 每天 0:00 会创建一个新的日志文件。

httpd.conf
# error.logのファイル名に_yyyymmddを付ける
ErrorLog "|bin/rotatelogs.exe logs/error_%Y%m%d.log 86400 540"

# access.logのファイル名にyyyymmddを付ける
<IfModule log_config_module>
    CustomLog "|bin/rotatelogs.exe logs/access_%Y%m%d.log 86400 540" common
</IfModule>

调音

调优只是将当前的 Web 服务器设置继承到 Apache2.4。
您必须测试它是否实际上是最佳设置。

httpd.conf
# 外部定義ファイル httpd-mpm.confとhttpd-default.confを有効にする
Include conf/extra/httpd-mpm.conf
nclude conf/extra/httpd-default.conf
httpd-mpm.conf
# WinNT MPM
<IfModule mpm_winnt_module>
    # ThreadsPerChildを250に変更する(デフォルトは150)
    ThreadsPerChild        250
    MaxConnectionsPerChild   0
</IfModule>

* httpd-default.conf 被省略,因为它是原始文件。

感想

现在我能够以与当前 Web 服务器相同的方式运行它。
不过,在再次研究Apache之后,我觉得我可以在安全性和性能方面做出更好的设置,所以我想借此机会多接触一下Apache。

参考

注解


  1. 我也考虑过Apache Haus,但它在设置中有一些自定义,所以我选择了 Apache Lounge 二进制文件,它尽可能接近原始文件。我还参考了 Apache Haus 的内容,例如 SSL 设置。 

  2. 我们选择 mod_proxy_http 的原因是因为它被当前的 Web 服务器使用。另外,听说现在的web服务器之所以采用它,是因为使用了mod_poxy_ajp,发生了连接相关的故障,但具体情况不明。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个问题可能是由于Apache2.4的配置问题或者端口被占用导致的。建议检查Apache2.4的配置文件,确保端口没有被占用,并且确保Apache2.4已经正确安装并且启动。如果问题仍然存在,可以尝试重新安装Apache2.4或者使用其他的Web服务器。 ### 回答2: 出现这种情况可能是由于多种原因导致的。以下是一些可能的原因和解决方法。 1. 端口冲突:Apache默认在80端口运行,如果其他应用程序正在使用该端口,可能会导致Apache无法启动。可以通过更改httpd.conf文件中的端口号来解决这个问题。 2. 配置错误:如果Apache配置文件中出现错误,会导致Apache无法启动。可以通过检查错误日志文件(一般为error_log),找到错误并进行修复。 3. 权限问题:如果Apache运行的用户没有足够的权限,也可能导致Apache无法启动。可以使用管理员权限运行Apache或者更改文件夹的权限以解决该问题。 4. 站点目录不存在:如果在配置文件中指定的站点目录不存在,Apache也无法启动。可以创建相应的目录或者更改配置文件以解决问题。 5. 防火墙阻止:如果防火墙阻止了Apache的访问,也会导致Apache无法启动。可以将Apache加入防火墙的例外列表或者关闭防火墙来解决问题。 总之,如果无法在本地计算机上启动Apache,需要检查配置文件、端口、权限、文件夹等各个方面的设置,找到错误并加以修复。 ### 回答3: 这可能是由于许多原因引起的,以下是一些常见的原因和解决方案: 1. 端口冲突:可能存在其他应用程序正在使用Apache所需的HTTP端口(默认为80)。您可以通过运行“netstat -a”命令来查找网络连接和端口。解决方法是更改Apache配置文件(httpd.conf)中的端口号,例如将其更改为8080。 2. 防火墙设置:您的计算机可能配置了防火墙,阻止Apache的访问。解决方法是配置防火墙以允许Apache通过HTTP端口运行。 3. 磁盘空间不足:Apache需要足够的磁盘空间才能运行。如果磁盘空间不足,则Apache将无法启动。解决办法是删除不必要的文件或将文件存储到较大的硬盘驱动器。 4. PHP或其他扩展程序问题:如果Apache无法加载PHP或其他扩展程序,则可能无法启动Apache。解决方法是确保PHP或其他扩展程序已正确安装并启用。 5. Apache配置错误:可能有误配置的问题阻止Apache启动。在此情况下,请检查Apache的错误日志文件查找问题所在,然后根据解决方案进行更改。 在解决这些常见问题之后,您可以尝试再次启动Apache服务器。如果问题持续存在,请详细检查您的计算机和服务器配置,并尝试在其他计算机上安装Apache以确定问题是否为特定于您的计算机。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值