目的
到目前为止,我已经用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 Lounge。1
- 雄猫: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
# 以下の#を除去してモジュールを有効にします。
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
# 以下のように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,转入
jsessionid
jsessionid 使用 mod_rewrite 模块删除,因为如果请求 URL 具有.
# 以下の#を除去してモジュールを有効にします。
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配置文件定义为环境变量。
② 创建加密密钥和 CSRopenssl 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 中创建和定义连接服务器证书和中间证书的文件。(未确认)
<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。
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
将请求从 http(80) 重定向到 https(443)
现在我启用了 SSL,我将其更改为将来自客户端的 http 请求重定向到 https。
#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,所以我暂时禁用了它。
# 以下に#を追加してモジュールを無効にします。
#LoadModule access_compat_module modules/mod_access_compat.so
禁用 htdocs 索引
在您的应用程序中禁用 htdocs 的目录列表。
<Directory "E:/Apache24/htdocs">
# 以下のOptionsのIndexesに(-)を付けて無効にします。FollowSymLinksは有効にするため(+)を付けます。
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>
日志轮换
默认情况下,Access.log 和 error.log 是不旋转的,所以使用 rotatelogs.exe 按日期输出日志文件。
* 每天 0:00 会创建一个新的日志文件。
# 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-mpm.confとhttpd-default.confを有効にする
Include conf/extra/httpd-mpm.conf
nclude conf/extra/httpd-default.conf
# WinNT MPM
<IfModule mpm_winnt_module>
# ThreadsPerChildを250に変更する(デフォルトは150)
ThreadsPerChild 250
MaxConnectionsPerChild 0
</IfModule>
* httpd-default.conf 被省略,因为它是原始文件。
感想
现在我能够以与当前 Web 服务器相同的方式运行它。
不过,在再次研究Apache之后,我觉得我可以在安全性和性能方面做出更好的设置,所以我想借此机会多接触一下Apache。
参考
- Apache 模块 mod_proxy
- 不要使用 Apache 的反向代理代理特定路径。
- Apache2.2同时使用ProxyPass和RewriteRule时的适配顺序
- 添加jsessionid时无法正常获取CSS文件等时的动作
- 来自 Apache2.4 的 SSL
- apache 2.4 中的 SSL 证书设置
- 使用 Apache 轻松构建反向代理
- Apache 模块 mod_access_compat
- 禁用目录列表
- Apache2.4中.htaccess的访问控制
注解
-
我也考虑过Apache Haus,但它在设置中有一些自定义,所以我选择了 Apache Lounge 二进制文件,它尽可能接近原始文件。我还参考了 Apache Haus 的内容,例如 SSL 设置。 ↩
-
我们选择 mod_proxy_http 的原因是因为它被当前的 Web 服务器使用。另外,听说现在的web服务器之所以采用它,是因为使用了mod_poxy_ajp,发生了连接相关的故障,但具体情况不明。 ↩