第八周
1. Tomcat 实现多虚拟主机
多虚拟主机是指在一台服务器上运行多个独立的网站,每个网站有自己的域名和应用。Tomcat 通过配置 server.xml 文件实现多虚拟主机:
- 在
conf/server.xml文件中,找到<Host>标签,添加新的虚拟主机配置。 - 配置示例:
<Host name="www.example1.com" appBase="webapps/example1" unpackWARs="true" autoDeploy="true"> </Host> <Host name="www.example2.com" appBase="webapps/example2" unpackWARs="true" autoDeploy="true"> </Host> - 每个
<Host>标签需要指定以下参数:name:虚拟主机的域名。appBase:虚拟主机的应用程序根目录。unpackWARs:是否自动解压.war文件。autoDeploy:是否自动部署应用。
- 配置完成后,将对应的应用程序部署到指定的
appBase目录下,并重启 Tomcat 服务。
2. Tomcat 定制访问日志格式和反向代理 Tomcat
-
定制访问日志格式:
- 在
conf/server.xml文件中,找到<Host>或<Valve>标签,添加或修改AccessLogValve配置。 - 示例:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> pattern属性用于定义日志格式,常见的格式说明符包括:%h:客户端 IP 地址。%l:客户端身份认证的用户名。%u:请求的用户。%t:请求的时间。%r:请求行。%s:HTTP 状态码。%b:发送的字节数。
- 在
-
反向代理 Tomcat:
-
可以通过 Nginx 或 Apache HTTP Server 配置反向代理,将请求转发到 Tomcat 服务器。
-
在 Nginx 中,配置示例:
[root@ubuntu ~]# cat /etc/nginx/conf.d/java.m99-magedu.com.conf server{ listen 80; server_name java.m99-magedu.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header host $http_host; } }
-
3. iptables 5 表 5 链、基本使用及扩展模块
-
5 表:
raw:用于处理连接跟踪。mangle:用于修改数据包内容。nat:用于网络地址转换。filter:用于数据包过滤。security:用于安全相关的处理。
-
5 链:
PREROUTING:数据包进入网络接口后,路由决策前。INPUT:数据包进入网络接口后,路由决策后。OUTPUT:本地生成的数据包。FORWARD:经过本机转发的数据包。POSTROUTING:数据包离开网络接口前。
-
基本使用:
- 添加规则:
iptables -A 链名 -p 协议 --dport 端口 -j 动作。 - 删除规则:
iptables -D 链名 规则编号。 - 查看规则:
iptables -L -n。
- 添加规则:
-
扩展模块:
conntrack:用于处理连接跟踪。geoip:用于基于地理位置的过滤。recent:用于限制特定 IP 的访问频率。
4. iptables 规则优化实践、规则保存和恢复
-
规则优化:
- 尽量减少规则数量,避免重复规则。
- 将最常用的规则放在前面,提高匹配效率。
-
规则保存和恢复:
- 保存规则:
iptables-save > 规则文件。 - 恢复规则:
iptables-restore < 规则文件。
- 保存规则:
5. NAT 转换原理、DNAT/SNAT 原理及架构设计
-
NAT 转换原理:
- NAT(网络地址转换)用于将一个 IP 地址空间的地址转换为另一个地址空间的地址,以解决 IP 地址不足的问题。
-
DNAT(目标地址转换):
- 将进入的数据包的目标地址转换为另一个地址,常用于端口映射。
- 示例:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080。
-
SNAT(源地址转换):
- 将发出的数据包的源地址转换为另一个地址,常用于多出口网络。
- 示例:
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.1。
-
架构设计:
- DNAT 架构:在防火墙或路由器上配置 DNAT 规则,将外部请求转发到内部服务器。
- SNAT 架构:在出口网关上配置 SNAT 规则,将内部网络的请求转换为外部 IP 地址。
6. 使用 REDIRECT 将 90 端口重定向到 80 端口
iptables -t nat -A PREROUTING -p tcp --dport 90 -j REDIRECT --to-port 80
该规则将进入的 TCP 90 端口请求重定向到本机的 80 端口。
7. firewalld 常见区域总结
- trusted:完全信任的区域,允许所有流量。
- home:家庭网络区域,允许部分可信流量。
- work:工作网络区域,允许部分可信流量。
- public:公共网络区域,仅允许必要的流量。
- dmz:非军事区,允许有限的流量。
- block:阻止所有流量。
- drop:丢弃所有流量。
8. 通过 nftables 暴露本机 80/443/ssh 服务端口给指定网络访问
nft add rule inet filter input ip saddr 192.168.1.0/24 tcp dport 80 accept
nft add rule inet filter input ip saddr 192.168.1.0/24 tcp dport 443 accept
nft add rule inet filter input ip saddr 192.168.1.0/24 tcp dport 22 accept
这些规则允许来自指定网络(192.168.1.0/24)的流量访问本机的 80、443 和 22 端口。
9. Nginx 反向代理 Tomcat 实现基于 Redis 会话复制的集群构建
-
Nginx 反向代理:
-
配置 Nginx 将请求转发到多个 Tomcat 实例。
-
示例:
[root@fan:~]#cat /etc/nginx/sites-enabled/java.m99-magedu.com.conf upstream tomcat { hash $cookie_JSESSION consistent; server 10.0.0.176:8080; server 10.0.0.177:8080; } server{ listen 80; server_name java.m99-magedu.com; return 302 https://$host$request_uri; } server{ listen 443 ssl; server_name java.m99-magedu.com; root /var/www/html/java.m99-magedu.com; ssl_certificate /usr/share/easy-rsa/pki/java.m99-magedu.com.pem; ssl_certificate_key /usr/share/easy-rsa/pki/private/java.m99-magedu.com.key; ssl_session_cache shared:sslcache:20m; ssl_session_timeout 10m; location ~* \.jsp$ { proxy_pass http://tomcat; proxy_set_header host $http_host; } } -
tomcat配置
-
cat /usr/local/tomcat/conf/context.xml <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="redis://10.0.0.153" sticky="false" sessionBackupAsync="false" lockingMode="uriPattern:/path1|/path2" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFact ory"/>
-
-
Redis 会话复制:
-
127.0.0.1:6379> keys * 1) "validity:5DD87372E4E7C3627F06A02811CA857B" 2) "5DD87372E4E7C3627F06A02811CA857B" 127.0.0.1:6379> keys * 1) "6E1A13A63BB2D716E71F24B5AB43C0A6" 2) "validity:5DD87372E4E7C3627F06A02811CA857B" 3) "5DD87372E4E7C3627F06A02811CA857B" 4) "validity:6E1A13A63BB2D716E71F24B5AB43C0A6" 127.0.0.1:6379>
-
10. JVM 垃圾回收算法和分代
-
分代:
- 新生代:频繁创建和销毁的对象存储在这里,包括 Eden 区和两个 Survivor 区。
- 老年代:长期存活的对象存储在这里。
- 永久代/元空间:存储类的元数据(JDK 8 及以后使用元空间)。
-
垃圾回收算法:
- 标记-清除算法:标记活动对象,清除未标记的对象。适用于老年代。
- 复制算法:将对象从一个空间复制到另一个空间。适用于新生代。
- 标记-压缩算法:标记活动对象并压缩内存,减少内存碎片。适用于老年代。
- 分代回收:新生代使用复制算法,老年代使用标记-压缩算法。

浙公网安备 33010602011771号