对于部分linux,例如centos release 6.6,默认情况下,1024以下的端口,例如80是只允许root用户使用的,非root用户没有权限。
因此就造成了,如果使用service方式启停tomcat,采用非root用户进行deamon一个实例时,tomcat没有权限启动80端口。
此时,我们只能使用8080端口,如果一定要使用80端口,可以的方式是:
1、停止iptables防火墙(不推荐)
2、通过iptables配置,进行端口重定向,将80指向8080,命令如下:
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A PREROUTING -p udp -m udp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 -m tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A OUTPUT -p udp -d 127.0.0.1 -m udp --dport 80 -j REDIRECT --to-ports 8080
当不需要的时候,可以清除:
iptables -t nat -F PREROUTING
iptables -t nat -F OUTPUT
3、如果需要删除指定的一条配置,可以使用如下命令:
iptables -t nat -L -n --line-numbers
该命令将会列出所有的配置信息
找到需要删除的记录,使用如下命令进行删除
iptables -t nat -D PREROUTING 3
注意:PREROUTING代表chain配置类型,3代表配置记录前面的序号。
4、由于执行了上面的命令,默认情况配置只是临时有效的(即重启前都是有效的,但是重启后就丢失配置了。)
可以使用如下命令进行保存配置,使得重启后仍然有效
iptables-save
列出当前的配置项,确认没有问题后,执行下面命令保存
service iptables save
执行该命令后,就会将配置保存至配置文件中。(该命令在CentOS下正常,因为已经加入到service服务中了,如果是其他的系统需要使用其他方式)
另一种方案,通过给非root用户一定的sudo权限,启动时,以root用户的身份执行某个命令,保证tomcat启动时能够正常使用80端口。
1、创建非root用户(比如用来给jenkins进行CI用的,只能拥有推送文件,重启tomcat等少数权限)
useradd -m jenkins
passwd jenkins
2、配置tomcat启动服务或者编写脚本(通过脚本控制文件的处理和tomcat服务的启停)(以root用户身份进行)
略
3、授予jenkins用户特定的sudo命令权限
打开(或者创建)权限文件:/etc/sudoers.d/jenkins
jenkins ALL= NOPASSWD: /home/jenkins/shell/deploy.sh
说明:授予jenkins执行/home/jenkins/shell/deploy.sh的sudo权限(注意:deploy.sh文件,如果是root用户创建,则一定不能让非root用户拥有修改权限,否则非root用户修改sh文件后,再通过sudo命令执行该文件,就突破了权限限制)
说明2:此处授权jenkins用户以NOPASSWD方式执行sudo命令
4、jenkins用户下, 通过sudo /home/jenkins/shell/deploy.sh来执行命令即可
在上面的sudo方案中,遇到一种更特殊的场景。
上面的sudo执行命令,默认会议root身份执行。如果我们需要通过sudo切换到另一个身份,比如用户USERA,应该如何处理呢?
其实也很简单:
首先,权限文件需要改成:jenkins ALL=(USERA) NOPASSWD: /home/jenkins/shell/deploy.sh
代表的是,jenkins 用户,可以以USERA的身份免密执行deploy.sh脚本
同时,在jenkins用户下,执行命令需要改成:
sudo -u USERA /home/jenkins/shell/deploy.sh