1. 项目概述
最近在帮一家小型电商企业搭建后台系统时,遇到了一个典型的部署需求:需要在本地服务器上安装Glassfish应用服务器,并实现外部网络的安全访问。这个案例很有代表性,今天就把完整实现过程整理出来,供有类似需求的同行参考。
Glassfish作为Oracle官方支持的开源Java EE应用服务器,在企业级应用部署中非常常见。相比Tomcat等轻量级容器,它提供了更完整的企业级功能支持,包括EJB容器、JMS服务、集群管理等。但很多开发者在从开发环境转向生产部署时,往往会遇到网络配置方面的挑战。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与安装
2.1 硬件与系统要求
建议的服务器配置:
- CPU:至少4核(推荐8核以上)
- 内存:8GB起步(生产环境建议16GB+)
- 磁盘:50GB可用空间(SSD优先)
- 操作系统:Linux(CentOS/Ubuntu Server)或Windows Server
注意:Glassfish对资源需求较高,特别是运行大型应用时。我在实际部署中发现,内存不足会导致频繁的Full GC,严重影响性能。
2.2 JDK安装与配置
Glassfish需要JDK支持,推荐使用OpenJDK 11:
bash复制# Ubuntu/Debian
sudo apt update
sudo apt install -y openjdk-11-jdk
# CentOS/RHEL
sudo yum install -y java-11-openjdk-devel
验证安装:
bash复制java -version
2.3 Glassfish安装步骤
- 下载最新稳定版(当前为6.2.5):
bash复制wget https://download.eclipse.org/glassfish/glassfish-6.2.5.zip
unzip glassfish-6.2.5.zip -d /opt
- 设置环境变量:
bash复制echo 'export GLASSFISH_HOME=/opt/glassfish6' >> ~/.bashrc
echo 'export PATH=$PATH:$GLASSFISH_HOME/bin' >> ~/.bashrc
source ~/.bashrc
- 启动域(domain):
bash复制asadmin start-domain domain1
3. 基础配置优化
3.1 管理员密码设置
默认安装后应立即修改管理员密码:
bash复制asadmin change-admin-password
3.2 JVM参数调优
编辑domain.xml配置文件:
bash复制vi $GLASSFISH_HOME/glassfish/domains/domain1/config/domain.xml
找到jvm-options部分,建议配置:
xml复制<jvm-options>-Xms2048m</jvm-options>
<jvm-options>-Xmx4096m</jvm-options>
<jvm-options>-XX:MaxMetaspaceSize=512m</jvm-options>
<jvm-options>-XX:+UseG1GC</jvm-options>
3.3 网络监听配置
检查HTTP监听端口(默认8080):
bash复制asadmin list-network-listeners
如需修改端口:
bash复制asadmin set configs.config.server-config.network-config.network-listeners.network-listener.http-listener-1.port=8888
4. 安全加固措施
4.1 防火墙配置
Linux系统(以Ubuntu为例):
bash复制sudo ufw allow 8080/tcp
sudo ufw allow 4848/tcp # 管理控制台端口
sudo ufw enable
Windows Server:
powershell复制New-NetFirewallRule -DisplayName "Glassfish HTTP" -Direction Inbound -LocalPort 8080 -Protocol TCP -Action Allow
4.2 管理控制台安全
- 禁用匿名访问:
bash复制asadmin set server.admin-service.property.adminConsoleDownload=false
- 限制管理接口IP访问:
bash复制asadmin set server.admin-service.property.adminConsoleRestrictAddress=true
4.3 SSL证书配置
生成自签名证书:
bash复制keytool -genkey -alias glassfish -keyalg RSA -keystore /opt/glassfish6/glassfish/domains/domain1/config/keystore.jks -keysize 2048 -validity 365
配置HTTPS监听器:
bash复制asadmin create-network-listener --protocol http-listener-1 --listenerport 8181 --jkenabled true ssl-listener
5. 实现外部访问方案
5.1 端口转发配置
如果服务器位于内网,需要在路由器设置端口转发:
- 外部端口:80/443 → 内部8080/8181
- 协议:TCP
实测经验:建议外部端口不要直接映射4848管理端口,存在安全风险。可以通过SSH隧道临时访问管理界面。
5.2 动态DNS配置(无固定公网IP时)
推荐使用免费DDNS服务:
- 注册No-IP或DynDNS账户
- 在路由器配置DDNS客户端
- 设置CNAME记录指向动态域名
5.3 反向代理方案(推荐)
使用Nginx作为前端代理:
nginx复制server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 强制HTTPS跳转
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass https://localhost:8181;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
6. 应用部署实践
6.1 WAR包部署
通过管理控制台:
- 访问 https://yourdomain.com:4848
- 导航至 Applications → Deploy
- 上传WAR文件并配置上下文根
或使用命令行:
bash复制asadmin deploy /path/to/your-app.war
6.2 数据源配置
创建JDBC连接池:
bash复制asadmin create-jdbc-connection-pool \
--datasourceclassname com.mysql.cj.jdbc.MysqlDataSource \
--restype javax.sql.DataSource \
--property user=dbuser:password=dbpass:serverName=localhost:portNumber=3306:databaseName=mydb \
MySqlPool
创建JDBC资源:
bash复制asadmin create-jdbc-resource --connectionpoolid MySqlPool jdbc/MyDB
6.3 日志配置调整
修改日志级别:
bash复制asadmin set-log-levels javax.enterprise.system.core.transaction=INFO
日志文件位置:
code复制/opt/glassfish6/glassfish/domains/domain1/logs/
7. 性能监控与维护
7.1 监控工具集成
启用JMX监控:
bash复制asadmin configure-jmx-connector --enabled=true
推荐使用VisualVM连接:
- 添加JMX连接:service:jmx:rmi:///jndi/rmi://your-server:8686/jmxrmi
- 使用admin用户名/密码认证
7.2 自动备份策略
备份domain配置:
bash复制asadmin backup-domain domain1
定时任务示例(每天凌晨2点):
bash复制0 2 * * * /opt/glassfish6/bin/asadmin backup-domain domain1
7.3 常见问题排查
- 端口冲突:
bash复制netstat -tulnp | grep 8080
- 内存泄漏诊断:
bash复制asadmin generate-jvm-report --type=memory
- 应用启动失败:
检查日志:
bash复制tail -f /opt/glassfish6/glassfish/domains/domain1/logs/server.log
8. 高级网络配置
8.1 负载均衡设置
配置Glassfish集群:
bash复制asadmin create-cluster myCluster
asadmin create-instance --cluster myCluster instance1
asadmin create-instance --cluster myCluster instance2
前端Nginx配置示例:
nginx复制upstream glassfish_cluster {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
keepalive 32;
}
server {
location / {
proxy_pass http://glassfish_cluster;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
8.2 会话复制配置
启用高可用会话:
bash复制asadmin set server-config.availability-service.web-container-availability.session-persistence-type=replicated
8.3 防火墙高级规则
限制特定IP访问管理端口:
bash复制sudo ufw allow from 192.168.1.100 to any port 4848
sudo ufw deny 4848/tcp
9. 安全审计与合规
9.1 定期安全检查清单
- 检查未授权访问:
bash复制nmap -sV -p 8080,4848 your-server-ip
- 验证SSL配置:
bash复制openssl s_client -connect yourdomain.com:443 | openssl x509 -noout -text
- 审计用户账户:
bash复制asadmin list-file-users
9.2 日志分析策略
配置日志轮转:
bash复制asadmin set-log-attributes --target server com.sun.enterprise.server.logging.GFFileHandler.rotationLimitInBytes=10485760
使用ELK堆栈收集分析日志:
- Filebeat配置示例:
yaml复制filebeat.inputs:
- type: log
paths:
- /opt/glassfish6/glassfish/domains/domain1/logs/*.log
9.3 备份与恢复测试
验证备份完整性:
bash复制asadmin restore-domain --force domain1 /path/to/backup.zip
10. 自动化部署方案
10.1 使用Docker容器化
Dockerfile示例:
dockerfile复制FROM ubuntu:20.04
RUN apt update && apt install -y openjdk-11-jdk wget
RUN wget https://download.eclipse.org/glassfish/glassfish-6.2.5.zip && \
unzip glassfish-6.2.5.zip -d /opt && \
rm glassfish-6.2.5.zip
ENV GLASSFISH_HOME=/opt/glassfish6
ENV PATH=$PATH:$GLASSFISH_HOME/bin
EXPOSE 8080 4848 8181
CMD ["asadmin", "start-domain", "--verbose", "domain1"]
构建与运行:
bash复制docker build -t glassfish-app .
docker run -d -p 8080:8080 -p 4848:4848 --name glassfish-container glassfish-app
10.2 CI/CD集成示例
Jenkins pipeline脚本片段:
groovy复制stage('Deploy to Glassfish') {
steps {
sh '''
asadmin undeploy ${APP_NAME} || true
asadmin deploy ${WORKSPACE}/target/*.war
asadmin restart-domain domain1
'''
}
}
10.3 配置管理工具
Ansible playbook示例:
yaml复制- hosts: glassfish_servers
tasks:
- name: Install OpenJDK
apt: name=openjdk-11-jdk state=present
- name: Download Glassfish
get_url:
url: https://download.eclipse.org/glassfish/glassfish-6.2.5.zip
dest: /tmp/glassfish.zip
- name: Unzip Glassfish
unarchive:
src: /tmp/glassfish.zip
dest: /opt
remote_src: yes
- name: Start domain
command: /opt/glassfish6/bin/asadmin start-domain domain1
