让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 [email protected]

# ログファイルローテーション
#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,发生了连接相关的故障,但具体情况不明。 

猜你喜欢

转载自blog.csdn.net/allway2/article/details/126264602