• 让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
    1. # 以下の#を除去してモジュールを有効にします。
    2. LoadModule proxy_module modules/mod_proxy.so
    3. LoadModule proxy_http_module modules/mod_proxy_http.so
    4. # 以下のようにProxyPassを追加し、Tomcat(port:8080)へ転送します
    5. ProxyPass /app http://localhost:8080/app
    6. ProxyPassReverse /app http://localhost:8080/app

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

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

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

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

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

    httpd.conf
    1. # 以下の#を除去してモジュールを有効にします。
    2. LoadModule rewrite_module modules/mod_rewrite.so
    3. # 以下のようにrewite定義を追記します。(proxyPassの前でも後でも大丈夫なようです)
    4. RewriteEngine On
    5. RewriteRule ^(.*);jsessionid=(.*)$ $1 [R,L]
    6. ProxyPass /app/images !
    7. ProxyPass /app/jss !
    8. ProxyPass /app/styles !
    9. ProxyPass /app http://localhost:8080/app
    10. ProxyPassReverse /app http://localhost:8080/app

    使用 SSL 连接

    SSL证书存放目录

    1. Apache24
    2. └ conf
    3. └ 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
    1. _:443>
    2. DocumentRoot "E:/Apache24/htdocs"
    3. #ServerName www.example.com:443
    4. #ServerAdmin admin@example.com
    5. # ログファイルローテーション
    6. #ErrorLog "E:/Apache24/logs/error.log"
    7. ErrorLog "|bin/rotatelogs.exe logs/ssl_error_%Y%m%d.log 86400 540"
    8. #TransferLog "E:/Apache24/logs/access.log"
    9. CustomLog "|bin/rotatelogs.exe logs/ssl_access_%Y%m%d.log 86400 540" common
    10. SSLEngine on
    11. # サーバー証明書と秘密鍵のパスを定義します
    12. SSLCertificateFile "E:/Apache24/conf/ssl/server_2017.crt"
    13. SSLCertificateKeyFile "E:/Apache24/conf/ssl/server.2017.key"
    14. "\.(cgi|shtml|phtml|php)$">
    15. SSLOptions +StdEnvVars
    16. E:/Apache24/cgi-bin">
    17. SSLOptions +StdEnvVars
    18. BrowserMatch "MSIE [2-5]" \
    19. nokeepalive ssl-unclean-shutdown \
    20. downgrade-1.0 force-response-1.0
    21. #CustomLog "E:/Apache24/logs/ssl_request.log" \
    22. # "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
    23. CustomLog "|bin/rotatelogs.exe logs/ssl_request_%Y%m%d.log 86400 540" \
    24. "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
    25. RewriteEngine On
    26. RewriteRule ^(.*);jsessionid=(.*)$ $1 [R,L]
    27. # リバースプロキシを設定してTomcatへ転送します。
    28. SSLProxyEngine on
    29. ProxyPass /app/images !
    30. ProxyPass /app/jss !
    31. ProxyPass /app/styles !
    32. ProxyPass /app http://localhost:8080/app
    33. ProxyPassReverse /app http://localhost:8080/app

    为 Apache 启用 SSL

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

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

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

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

    httpd.conf
    1. #ewriteEngine On
    2. #RewriteRule ^(.*);jsessionid=(.*)$ $1 [R,L]
    3. #ProxyPass /app/images !
    4. #ProxyPass /app/jss !
    5. #ProxyPass /app/styles !
    6. #ProxyPass /app http://localhost:8080/app
    7. #ProxyPassReverse /app http://localhost:8080/app
    8. #httpでのリバースプロキシはやめ、httpsでリダイレクトするように変更しました。
    9. RewriteEngine On
    10. RewriteCond %{HTTPS} off
    11. RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

    其他设置

    禁用 mod_access_compat

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

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

    禁用 htdocs 索引

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

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

    日志轮换

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

    httpd.conf
    1. # error.logのファイル名に_yyyymmddを付ける
    2. ErrorLog "|bin/rotatelogs.exe logs/error_%Y%m%d.log 86400 540"
    3. # access.logのファイル名にyyyymmddを付ける
    4. CustomLog "|bin/rotatelogs.exe logs/access_%Y%m%d.log 86400 540" common

    调音

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

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

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

    感想

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

    参考

    注解


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

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

  • 相关阅读:
    Django中间件
    typora常用偏好设置
    ptyhon flask SSE 浏览器和服务器实时通信-例子实时推送随机数到前端画echart曲线图
    深入探究 JVM 频繁 Full GC 的排查过程
    ElasticSearch安装部署,单节点部署,集群部署
    基于声信道分析的电缆隧道人员定位技术
    UNIAPP实战项目笔记32 购物车无商品默认样式
    Android WebView中打开外部超链接无反应
    mysql表操作
    直击程序员面试现场:百度面试官都问了我些啥?
  • 原文地址:https://blog.csdn.net/allway2/article/details/126264602