Jenkins基础教程(26)Jenkins安装之基于Apache 服务器运行Jenkins:笑出强大:Jenkins与Apache的“包办婚姻“实录

曾经有一个亲手配置服务器的机会摆在我面前,我没有珍惜,直到面对一堆404错误才追悔莫及——如果上天再给我一次机会,我会对那个Jenkins说:我打包你了!

01 缘起:一个懒人的自我修养

作为一名程序员,我的人生信条是:能让机器干的,绝不自己动手。正是这一信条,让我走上了Jenkins的不归路。

想想那些年我们经历过的痛苦:代码写完还要手动打包、上传、部署,测试失败要来回折腾……

作为一名专业的“懒人”,我决定找一个能帮我搞定这些重复劳动的工具。于是,Jenkins进入了我的视野。

Jenkins到底是什么?简单说,它就是你的私人自动化助理。这款开源CI/CD工具能帮你自动完成构建、测试和部署软件的各种任务。

但问题是,Jenkins本身就是一个Java应用,需要运行在某个服务器上。而我已经有了一个Apache服务器在运行着网站。

难道我要为了Jenkins再开一个新端口,让用户访问8080吗?不,这太不优雅了!

于是,我萌生了一个想法:让Jenkins和Apache“结婚”,让Apache作为Jenkins的“代言人”,处理所有对外通信。

这就是所谓的反向代理配置——让Apache充当Jenkins的门面,所有访问Jenkins的请求都先经过Apache,再由Apache转发给Jenkins。

02 婚前准备:环境摸底与软硬件配对

任何一段“婚姻”开始前,都需要了解双方的基本情况。Jenkins和Apache的“结合”也不例外。

首先要确认的是系统环境。Jenkins相当随和,它可以在大多数操作系统上安家,无论是Linux、Windows还是macOS。

我选择的是Ubuntu系统,因为它对新手友好,而且有完善的包管理机制。

接下来是软件要求。Jenkins是用Java编写的,所以需要JRE或JDK的支持。官方建议使用Java 8或更高版本。

检查Java环境很简单,打开终端输入:

java -version

如果显示类似以下信息,说明Java环境已经就绪:

java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)

如果没有安装Java,可以通过以下命令安装(以Ubuntu为例):

sudo apt update
sudo apt install openjdk-8-jdk

Apache HTTP服务器的安装也很简单:

sudo apt install apache2

安装完成后,可以通过访问 http://your-server-ip 来验证Apache是否正常工作。如果看到Apache的默认欢迎页面,恭喜你,Apache已经准备就绪。

现在,双方都已准备好“见面”——Jenkins需要Java环境,Apache也已就位。下一步就是正式介绍它们认识。

03 相亲:多种Jenkins安装方式对比

介绍Jenkins和Apache认识,有几种不同的方式,就像相亲可以通过不同场合安排一样。

3.1 传统包管理安装:家人介绍的相亲

这种方法最简单直接,适合想要快速上手的新手。

在基于Debian/Ubuntu的系统上:

sudo apt update
sudo apt install jenkins

在基于CentOS/RHEL的系统上:

sudo yum install jenkins

安装完成后,启动Jenkins服务并设置开机自启:

sudo systemctl start jenkins
sudo systemctl enable jenkins

这种方式的优点是简单,缺点是Jenkins版本可能不是最新的。

3.2 WAR文件安装:自由恋爱

如果你想使用最新版本的Jenkins,或者想要更灵活地控制Jenkins的运行方式,那么直接下载WAR文件是个不错的选择。

Jenkins官方直接提供WAR文件下载,你可以通过以下方式运行:

java -jar jenkins.war

这样,Jenkins就会在你的机器上启动,并且默认会运行在8080端口。

如果你想在后台运行Jenkins,可以使用nohup命令:

nohup java -jar jenkins.war --httpPort=8000 >jenkins.log 2>&1 &

这个命令指定Jenkins运行在8000端口,并将日志输出到jenkins.log文件中。

3.3 容器化部署:新时代的网恋

如果你熟悉Docker,那么通过容器部署Jenkins可能是最便捷的方式:

docker run -d --name jenkins -p 8080:8080 jenkins/jenkins:lts

这种方式让你可以轻松地创建、销毁和迁移Jenkins实例,非常适合测试环境。

我选择了包管理安装,因为它与系统集成更好,管理起来也更方便。安装完成后,Jenkins服务会自动启动,并默认运行在8080端口。

04 婚前协议:Apache反向代理配置

现在,Jenkins和Apache已经各自就位,但它们还是“陌生人”。我们需要建立一个“沟通渠道”,让它们能够互相交流。

在技术术语中,这叫做配置反向代理。反向代理的工作原理是:当有请求到达Apache时,如果请求的是特定URL,Apache会将这些请求转发给Jenkins,然后将Jenkins的响应返回给客户端。

为什么要这么麻烦?有以下几个好处:

  1. 统一访问入口:用户只需要记住一个域名和端口,无需记住Jenkins的特殊端口
  2. 安全性:可以通过Apache配置SSL、访问控制等安全措施
  3. 灵活性:可以在同一台服务器上运行多个Web应用,由Apache统一分发请求

配置Apache反向代理需要以下几个步骤:

4.1 启用必要的Apache模块

首先,需要确保以下Apache模块已启用:

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod headers
# 为Jenkins的WebSocket代理所需
sudo a2enmod proxy_wstunnel
sudo a2enmod rewrite

4.2 配置虚拟主机

接下来,需要配置Apache虚拟主机,将特定路径的请求转发给Jenkins。

假设你想通过 http://your-domain.com/jenkins 访问Jenkins,那么配置如下:

ProxyPass         /jenkins  http://localhost:8080/jenkins nocanon
ProxyPassReverse  /jenkins  http://localhost:8080/jenkins
ProxyRequests     Off
AllowEncodedSlashes NoDecode

# 为Jenkins的WebSocket代理所需配置
RewriteEngine on
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/jenkins/?(.*) "ws://localhost:8080/jenkins/$1" [P,L]

# 本地反向代理授权覆盖
<Proxy http://localhost:8080/jenkins*>
  Order deny,allow
  Allow from all
</Proxy>

这个配置假设Jenkins运行在本地8080端口,并且使用/jenkins作为上下文路径。

如果你希望Jenkins成为网站的根路径(即通过http://your-domain.com/直接访问),配置可以简化为:

ProxyPass         /  http://localhost:8080/ nocanon
ProxyPassReverse  /  http://localhost:8080/
ProxyRequests     Off

<Proxy http://localhost:8080/*>
  Order deny,allow
  Allow from all
</Proxy>

4.3 安全考虑

当配置反向代理时,有一个重要的安全注意事项:确保将Jenkins的监听地址从0.0.0.0改为127.0.0.1

这可以防止用户绕过Apache的安全限制,直接访问Jenkins端口。

要修改Jenkins的监听地址,可以编辑Jenkins的配置文件(通常是/etc/default/jenkins),找到以下行:

JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpPort=8080"

将其修改为:

JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpPort=127.0.0.1:8080"

然后重启Jenkins服务:

sudo systemctl restart jenkins

4.4 SELinux考虑

如果你在Security-Enhanced Linux (SE-Linux)系统上运行Apache,还需要设置一个特殊的布尔值,允许Apache转发代理请求到Jenkins:

setsebool -P httpd_can_network_connect true

如果不设置这个,Apache将不被允许向Jenkins转发请求,只会显示错误消息。

完成以上配置后,重新加载Apache配置:

sudo systemctl reload apache2

现在,你可以通过Apache代理访问Jenkins了!

05 婚后生活:Jenkins基本配置与使用

Jenkins和Apache的“婚姻”已经安排妥当,现在来看看它们的“婚后生活”如何。

首次访问Jenkins时,需要通过浏览器访问你设置的地址,如http://your-domain.com/jenkins

5.1 初始解锁Jenkins

第一次访问Jenkins时,你会看到一个“解锁Jenkins”的页面,要求输入初始管理员密码。

这个密码可以在服务器上的特定位置找到:

  • 对于包管理安装:/var/lib/jenkins/secrets/initialAdminPassword
  • 对于WAR文件安装:在Jenkins工作目录的secrets/initialAdminPassword文件中

使用cat命令查看初始密码:

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

将显示的内容复制到解锁页面中的输入框,然后点击“继续”。

5.2 安装推荐插件

接下来,Jenkins会提示你安装插件。建议选择“安装推荐插件”,这些插件包括Git、Pipeline等常用工具,能够帮助你快速开始使用Jenkins。

插件安装过程可能需要一些时间,具体取决于你的网络速度和服务器性能。

5.3 创建管理员用户

插件安装完成后,会提示你创建一个管理员用户。建议务必创建并记好凭证,以便后续管理Jenkins。

如果你跳过这一步,初始管理员密码将继续作为管理员账户的密码。

5.4 配置实例

最后,需要配置Jenkins实例的URL。这个URL应该是用户访问Jenkins时使用的地址,即Apache代理的地址,如http://your-domain.com/jenkins

完成这些步骤后,Jenkins就完全准备好了!

06 爱的结晶:创建你的第一个Jenkins任务

Jenkins和Apache已经幸福地生活在一起,现在该让它们“生儿育女”了——创建Jenkins任务来自动化你的工作。

Jenkins支持多种类型的任务,最常见的是流水线任务

6.1 创建流水线任务

在Jenkins首页,点击“新建任务”,输入任务名称,选择“流水线”类型,然后点击“确定”。

在配置页面中,找到“流水线”部分,这里可以定义你的构建流程。

6.2 编写Jenkinsfile

Jenkinsfile是一个基于Groovy的脚本,描述了从代码提交到部署的整个流程。

以下是一个基本的Jenkinsfile示例:

pipeline {
    agent any
    stages {
        stage('Checkout') {
            steps {
                git url: 'https://github.com/your-repository.git', branch: 'main'
            }
        }
        stage('Build') {
            steps {
                echo 'Building...'
                sh 'mvn clean install'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing...'
                sh 'mvn test'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying...'
                sh 'scp target/*.jar user@production-server:/path/to/deploy'
            }
        }
    }
    post {
        always {
            echo 'Build Summary'
            mail to: 'dev.team@example.com', subject: "Build #${BUILD_NUMBER} Summary", body: "Build status: ${currentBuild.result}"
        }
    }
}

这个流水线定义了四个阶段:

  1. 检出:从Git仓库拉取代码
  2. 构建:使用Maven构建项目
  3. 测试:运行项目测试
  4. 部署:将构建产物部署到生产服务器

在每个阶段中,可以执行各种操作,如执行Shell命令、发送邮件等。

流水线执行完成后,还会发送一封构建总结邮件给开发团队。

6.3 配置构建触发器

可以配置任务在特定条件下自动触发,例如代码提交时或定时构建。

常见的触发器包括:

  • GitHub钩子触发器:当GitHub仓库有推送时触发构建
  • 轮询SCM:定期检查代码仓库是否有变更
  • 定时构建:按照cron表达式定义的时间定期构建

例如,要配置任务每5分钟检查一次代码变更,可以在“构建触发器”部分选择“轮询SCM”,然后输入日程表:H/5 * * * *

6.4 手动触发构建

配置完成后,点击“保存”即可创建任务。要手动触发第一次构建,可以点击“立即构建”。

构建开始后,可以在“构建历史”中查看构建进度,点击构建编号可以查看详细日志。

07 婚姻咨询:常见问题与排错指南

即使是最美满的“婚姻”,也难免会遇到一些小摩擦。下面是一些常见问题及其解决方法。

7.1 Apache代理错误

问题:通过Apache访问Jenkins时出现503错误或连接拒绝。

解决

  • 确认Jenkins服务正在运行:sudo systemctl status jenkins
  • 确认Jenkins监听地址和端口与Apache配置一致
  • 检查Apache错误日志:sudo tail -f /var/log/apache2/error.log

7.2 权限问题

问题:Jenkins无法访问某些目录或执行某些命令。

解决

  • 确保Jenkins用户对相关目录有适当权限
  • 如果使用Docker部署,确保正确挂载了卷
  • 检查SELinux设置,确保Apache可以连接网络

7.3 插件安装失败

问题:Jenkins插件安装缓慢或失败。

解决

  • 更换Jenkins插件镜像源为国内镜像
  • 检查网络连接和防火墙设置
  • 手动下载插件并上传安装

7.4 WebSocket连接问题

问题:Jenkins的实时日志或Console Output不工作。

解决

  • 确保Apache配置中启用了proxy_wstunnel模块
  • 检查RewriteRule配置是否正确
  • 确认Jenkins Location配置中的URL正确

7.5 内存不足

问题:Jenkins运行缓慢或频繁崩溃。

解决

  • 增加Jenkins可用的堆内存大小
  • 编辑/etc/default/jenkins文件,修改JAVA_ARGS行:
JAVA_ARGS="-Xmx2048m -Xms512m"
  • 重启Jenkins服务

记住,排错是一个系统过程:检查日志、确认配置、逐步排查。Jenkins的日志文件通常位于/var/log/jenkins/jenkins.log,Apache的日志位于/var/log/apache2/

08 幸福生活:优化与最佳实践

当Jenkins和Apache的“婚姻”步入正轨后,可以考虑一些优化措施,让它们的“生活”更加幸福美满。

8.1 启用HTTPS

在生产环境中,应该使用HTTPS加密通信。

首先,获取SSL证书(可以使用Let's Encrypt的免费证书),然后在Apache配置中启用HTTPS:

<VirtualHost *:443>
    ServerName your-domain.com
    
    SSLEngine on
    SSLCertificateFile /path/to/cert.pem
    SSLCertificateKeyFile /path/to/private.key
    SSLCertificateChainFile /path/to/chain.pem

    ProxyPreserveHost On
    ProxyPass         /  http://localhost:8080/ nocanon
    ProxyPassReverse  /  http://localhost:8080/
    
    # WebSocket配置
    RewriteEngine on
    RewriteCond %{HTTP:Upgrade} websocket [NC]
    RewriteCond %{HTTP:Connection} upgrade [NC]
    RewriteRule ^/(.*) "ws://localhost:8080/$1" [P,L]
</VirtualHost>
# HTTP重定向到HTTPS
<VirtualHost *:80>
    ServerName your-domain.com
    Redirect permanent / https://your-domain.com/
</VirtualHost>

8.2 定期备份

定期备份Jenkins配置和数据是非常重要的。可以使用Jenkins的备份插件,或者手动备份Jenkins主目录(通常是/var/lib/jenkins)。

8.3 监控与日志

设置监控,定期检查Jenkins和Apache的运行状态和资源使用情况。可以使用Jenkins的Monitoring插件,或者集成外部监控系统。

8.4 定期更新

定期更新Jenkins和插件,以获取最新功能和安全补丁。但要注意,在生产环境更新前,先在测试环境验证

8.5 性能优化

如果Jenkins运行缓慢,可以考虑以下优化措施:

  • 增加Jenkins堆内存
  • 使用SSD存储
  • 配置Jenkins代理分散构建负载
  • 定期清理旧的构建数据

09 结语:自动化之美

通过本文的讲解,你已经学会了如何让Jenkins和Apache“喜结连理”,实现自动化构建、测试和部署。

这段“婚姻”的美妙之处在于:你只需一次配置,就能长期享受自动化带来的便利

当你的代码提交后,Jenkins会自动检测变更、拉取代码、运行构建和测试,最后部署到目标环境。这一切都是自动完成的,无需人工干预。

这意味着你可以更专注于代码开发,而不是重复的构建和部署工作。

更重要的是,这种自动化流程能够及早发现集成错误,提高软件质量,加速交付过程——这正是持续集成和持续交付的核心价值。

Jenkins与Apache的搭配只是开始,Jenkins的真正强大之处在于其丰富的插件生态和灵活的扩展性

你可以根据需要安装各种插件,集成不同的工具和服务,构建出完全符合你项目需求的CI/CD流水线。

现在,是时候开始你的Jenkins之旅了!配置好Jenkins和Apache,享受自动化带来的轻松和高效吧!


最终,我成功地将Jenkins和Apache撮合到了一起。看着它们默契配合,自动完成构建、测试和部署,我不禁感叹:这世上最美好的事情,莫过于你写的代码自己会打包、测试、部署,而你只需要喝杯咖啡,等邮件通知

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值