Linux部署jumpserver堡垒机及问题汇总

部署过程相对复杂!请耐心浏览!

目录

一、jumpserver堡垒机简介

1.1 为什么需要使用堡垒机?

1.2 堡垒机主要功能

二、准备工作

2.1 关闭防火墙以及SElinux

1.2 时间同步

1.3 更改主机名

1.4 yum源备份及准备

1.5 安装初始工具

1.6 修改系统字符集

1.7 重启

三、安装Mysql

3.1 删除mairadb(CentOS7自带mariadb)

3.2 安装mysql5.7

3.3 更改mysql密码及密码复杂度

四、安装python3.6

4.1 安装python3.6

4.2 更换pip3源

4.3 安装python虚拟环境

五、安装redis

六、部署jumpserver

6.1 下载解压

6.2 安装依赖或工具

6.3 安装python虚拟环境下的py模块

6.4 获取SECRET_KEY、BOOTSTRAP_TOKEN秘钥

6.5 更改jumpserver配置文件

七、数据迁移

7.1 查看jumpserver数据库

7.2 数据迁移

7.3 再次查看jumpserver数据库

八、启动jumpserver服务

九、部署koko组件

十、部署guacamole组件

10.1 下载guacamole-server及ssh-forward

10.2 安装ffmpeg工具

10.3 编译安装guacamole

10.4 安装java环境

10.5 设置guacamole环境

10.6 启动tomcat和guacamole

十一、lina/luna模块

11.1 新建Linux用户nginx

11.2 安装lina/luna

十二、编译安装nginx、nginx-module-vts

12.1 下载nginx

11.2 更改nginx.conf

11.3 验证nginx

11.4 监控列表解释

十二、再次更改nginx配置

十三、访问jumpserver

十四、问题汇总

14.1 pip包路径

14.2 nginx占用及重启

14.3 mysql导入数据错误

14.4 pip3 install virtualenv 报错

14.5 重启主机后启动jumpserver

十五、参考链接

一、jumpserver堡垒机简介

1.1 为什么需要使用堡垒机?

        为了避免非云运维的人员对公司内部的服务器进行错误操作,导致损失,那么我们就需要用到跳板机,即使公司内部人员,需要操作服务器也得经过验证。并且连接上跳板机后,所有的登陆和操作记录都会被记录。

跳板机:
        跳板机就是一台服务器而已,运维人员在使用管理服务器的时候,必须先连上跳板机,然后才能去操控内网中的服务器,才能登录到目标设备上进行维护和操作。跳板机他是属于内网堡垒机的范畴,是一种用于单点登陆的主机应用系统。跳板机缺点,仅仅实现服务器登陆的安全,但是没有实现对于运维开发人员行为操控和审计。使用跳板机可能会对服务器进行错误操作,很难定位到操作人。

堡垒机:
        结合了跳板机的优点,并且可以记录操作人员和记录,堡垒机能够创建系统账号,该系统账号功能是属于角色区分的作用,但是也无法确认该账号的执行人。

堡垒机的作用:
        由于跳板机的不足,企业需要更新,更好,更安全的技术理念去管理服务器的运维操作,需要一种能够满足角色管理,角色授权,信息资源访问控制,操作记录和审计,系统更变和维护控制等等需求。

        1、核心系统运维和安全审计管理

        2、过滤和拦截非打请求访问,恶意攻击,拒绝不合法命令,进行审计口监控,报警和责任追踪

        3、报警,记录,分析,处理

1.2 堡垒机主要功能

        1、单点登陆功能

        2、账号管理功能

        3、身份认证

        4、资源授权

        5、访问控制

二、准备工作

虚拟机平台:VMware
IP:192.168.132.65 (自定义)
虚拟机配置:1vpcu 1核 2G 40G (测试学习环境,生产环境具体情况而定)
没有特别说明情况下,所有wget或下载的文件默认存储在/opt目录下
python = 3.6.x  Python版本必须3.6及以上
mysql5.7 版本必须大于5.6
redis  缓存型数据库

2.1 关闭防火墙以及SElinux

systemctl stop firewalld
systemctl disable firewalld

关闭selinux,重启后生效
修改/etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled

1.2 时间同步

date

yum install ntpdate -y
timedatectl set-timezone Asia/Shanghai
ntpdate ntp1.aliyun.com
systemctl enable ntpdate

date  #查看系统时间是否同步准确

1.3 更改主机名

hostnamectl set-hostname jumpserver

1.4 yum源备份及准备

mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/    #备份yum源

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

yum clean all
yum makecache  #清楚缓存,重写建立yum仓库

1.5 安装初始工具

yum install -y bash-completion vim lrzsz wget expect net-tools nc nmap tree dos2unix htop iftop iotop unzip telnet sl psmisc nethogs glances bc ntpdate openldap-devel gcc zlib zlib-devel

1.6 修改系统字符集

echo 'LANG="zh_CN.UTF-8"' > /etc/locale.conf  #永久修改,无需重启

 ls --help可查看,显示部分中文表示修成功

1.7 重启

reboot

三、安装Mysql

先安装mysql,否则后续mysql的安装报错很难处理,先保证mysql安装完成。

3.1 删除mairadb(CentOS7自带mariadb)

centos7自带的类mysql数据库是mariadb,会跟mysql冲突,必须先删除!!!

3.2 安装mysql5.7

cd /opt

wget http://dev.mysql.com/get/mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar
tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar

mkdir mysql
mv mysql-community*.rpm mysql   #移动到mysql目录下

rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm

rpm -ivh mysql-community-devel-5.7.26-1.el7.x86_64.rpm (平时安装mysql这个可以省略,但部署jumpserver后续步骤会用到mysql-devel工具)

systemctl start mysqld
systemctl enable mysqld

如果报以下错误,请加上--nodeps 属性,添加该属性表示不检查依赖关系。

warning: mysql-community-server-5.7.26-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
error: Failed dependencies:

查看root用户初始密码

grep 'temporary password' /var/log/mysqld.log

 如果查看密码为空白,需要删除mysql残留文件

rm -rf /var/lib/mysql
systemctl restart mysqld
grep 'temporary password' /var/log/mysqld.log

3.3 更改mysql密码及密码复杂度

mysql -uroot -p
#黏贴刚刚拿到的密码

show variables like 'validate_password%';  #查看密码复杂度

mysql> set global validate_password_length=6;  #长度
mysql> set global validate_password_mixed_case_count=0;  #字符个数
mysql> set global validate_password_special_char_count=0;  #特殊符号个数
mysql> flush privileges;

create database jumpserver default charset 'utf8' collate 'utf8_bin';  #新建名为jumpserver的数据库
set password for 'root'@'localhost' =password('yz123456');  #更改mysql的root用户密码为yz123456
create user 'jumpserver'@'%' IDENTIFIED BY 'yz123456';  #创建mysql用户jumpserver且密码为yz123456

grant all privileges on root.* to 'jumpserver'@'%' identified by 'yz123456';
grant all privileges on jumpserver.* to 'jumpserver'@'%' identified by 'yz123456';  #赋权

密码复杂度属性解释:

validate_password_length      #密码长度 
validate_password_mixed_case_count    #大小写字符个数
validate_password_number_count         #数字个数 
validate_password_special_char_count    #特殊字符个数

四、安装python3.6

4.1 安装python3.6

pyhton版本必须大于或等于3.6.X

cd /opt
wget https://www.python.org/ftp/python/3.6.10/Python-3.6.10.tgz
tar -xvf Python-3.6.10.tgz

yum install -y openssl openssl-devel  #ssl工具,必须在安装python前安装

cd /opt/Python-3.6.10/
./confiure --prefix=/usr/local/python3.6  #编译并指定python3.6目录
make -j3 && make instal  #编译安装

echo "PATH="/usr/local/python3.6/bin:$PATH"" >> /etc/profile  #添加环境
source /etc/profile  #刷新一下环境
##随后命令行输入python3.6就能进入了(quit()退出)

注意终端输入python、python3.6结果不同,python2.7为Linux自带,不需要卸载,不影响。

4.2 更换pip3源

mkdir /root/.pip
touch /root/.pip/pip.conf
vim /root/.pip/pip.conf

#########将下面的内容写入###########

[global]
index-url = https://mirrors.aliyun.com/pypi/simple/

4.3 安装python虚拟环境

        创建虚拟环境是为了应对一台服务区中的多个应用所需的相同版本py,不同模块的场景。virtualenv为python虚拟化模块工具。

pip3 install virtualenv

cd /usr/local
virtualenv  --python=python3 jmp_venvl

 

注意此时有两个python解释器

解释器本体就是:/usr/local/python3.6/bin/python3.6

虚拟解释器就是:/usr/local/jmp_venel/bin/python3

切换python虚拟环境

source /usr/local/jmp_venvl/bin/activate  #刷新环境,可以进去python虚拟环境,进入后终端会哟jmp_venvl标识

deactivate  #退出当前的虚拟环境/切换回物理真实环境

此时输入python也是3.6版本而不是2.7,因为此时在虚拟环境中。

五、安装redis

yum -y install redis
systemct start redis
systemct enable redis

redis-cli  #验证
[root@jumpserver ~]# redis-cli
127.0.0.1:6379> ping
PONG  #返回PONG证明可以正常启动

六、部署jumpserver

6.1 下载解压

wget https://github.com/jumpserver/jumpserver/releases/download/v2.1.0/jumpserver-v2.1.0.tar.gz
tar -zxvf jumpserver-v2.1.0.tar.gz
ln -s /opt/jumpserver-v2.1.0 jumpserver

6.2 安装依赖或工具

yum install -y bash-completion vim lrzsz wget expect net-tools nc nmap tree dos2unix htop  iftop iotop unzip telnet sl psmisc nethogs glances bc ntpdate openldap-devel

6.3 安装python虚拟环境下的py模块

 注意:安装jumperserver模块,必须保证在py3的虚拟环境,一定要先激活环境再安装!!!

cd /opt/jumpserver/requirements/
cat /opt/jumpserver/requirements/requirements.txt

source /usr/local/jmp_venvl/bin/activate  #非常重要!!!
pip3 install -r /opt/jumpserver/requirements/requirements.txt

deactivate

pip3 requirements.txt 报错 

No matching distribution found for mysqlclient==1.3.14

提示找不到mysqlclient==1.3.14,在requirements.txt中确实有这一项,需要安装mysql-devel ,如果按照我步骤安装mysql不会出现这个报错。网上很多帖子使用yum安装, yum install mysql-devel 提示没有yum源, 因为采用手动安装mysql,所以没有mysql的repo源,我们手动安装mysql-devel即可,若报错,加上 --nodeps 属性。

###解决方法###
cd /opt/mysql
rpm -ivh mysql-community-devel

6.4 获取SECRET_KEY、BOOTSTRAP_TOKEN秘钥

后续步骤需要用到这两个秘钥

#获取SECRET_KEY
if [ "$SECRET_KEY" = "" ]; then SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 50` ; echo "SECRET_KEY=$SECRET_KEY" >> ~/.bashrc; echo $SECRET_KEY; else echo $SECRET_KEY; fi

#获取BOOTSTRAP_TOKEN
if [ "$BOOTSTRAP_TOKEN" = "" ]; then BOOTSTRAP_TOKEN=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 16`; echo "BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN" >> ~/.bashrc; echo $BOOTSTRAP_TOKEN; else echo $BOOTSTRAP_TOKEN; fi

SECRET_KEY: UtsbR8W5fJ81M4s6k0vcITUiASsHOTRKOIq0KvCnzzXupQpqcp BOOTSTRAP_TOKEN: 1iTfoBKVFv13PtSg 

6.5 更改jumpserver配置文件

cd /opt/jumpserver
cp config_example.yml config.yml  #example是配置文件模板,真正生效的配置文件是config.yml
vim config.yml

#将刚刚两个密钥填入,并填一下数据库密码"yz123456"

egrep -v "^#|^$" config.yml 可以把注释内容以及空行去掉再显示,可以简洁查看配置文件有效信息。此处两个密钥要更改成你的,在填写数据库密码,其他不用更改。

[root@jumpserver jumpserver]# cd /opt/jumpserver
[root@jumpserver jumpserver]# egrep -v "^#|^$" config.yml
SECRET_KEY: UtsbR8W5fJ81M4s6k0vcITUiASsHOTRKOIq0KvCnzzXupQpqcp  #KEY
BOOTSTRAP_TOKEN: 1iTfoBKVFv13PtSg                               #TOKEN
DB_ENGINE: mysql     #使用的数据库是什么
DB_HOST: 127.0.0.1   #默认的IP地址
DB_PORT: 3306        #默认端口
DB_USER: jumpserver      #默认的用户就是我们在数据库那步创建的user
DB_PASSWORD:yz123456     #数据库的密码
DB_NAME: jumpserver      #数据库用户名
HTTP_BIND_HOST: 0.0.0.0  #jumpserver运行的地址,写的0表示绑定这台机器对内对外所有的IP,如果是在公网的jumpserver会很危险
HTTP_LISTEN_PORT: 8080   #jumpserver后台启动的地址
WS_LISTEN_PORT: 8070     #WEB SOCKET
REDIS_HOST: 127.0.0.1    # 默认redis的IP
REDIS_PORT: 6379         #默认redis的端口

七、数据迁移

        jumpserver这个程序由python的web框架django开发而来。必须先进行数据迁移,生成库表的信息,才能运行程序。

7.1 查看jumpserver数据库

[root@jumpserver jumpserver]# mysql -u root -p
Enter password: 

mysql> show databases;   #查看数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| jumpserver         |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.01 sec)
mysql> use jumpserver    #进入到jumpserver这库中
Database changed
mysql> show tables;      #查看库中的表
Empty set (0.00 sec)     #还未导入,库中无表

7.2 数据迁移

一定要先进入python虚拟环境!!!

source /usr/local/jmp_venvl/bin/activate
cd /opt/jumpserver/apps
python3 /opt/jumpserver/apps/manage.py makemigrations  #显示浅蓝色字体表示成功
python3 /opt/jumpserver/apps/manage.py migrate         #显示多张表导入成功并有OK字样

deactivate

 报错使用请添加--fake属性,python manage.py migrate --fake

如果数据表返回OK位置显示faked表示迁移失败,请检查mysql启动情况,systemctl status mysqld,确保mysqld已经running。

7.3 再次查看jumpserver数据库

数据迁移成功

(jmp_venvl) [root@jumpserver /]# mysql -u root -p
Enter password: 

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| jumpserver         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.12 sec)

mysql> use jumpserver;
Database changed

mysql> show tables;
+----------------------------------------------+
| Tables_in_jumpserver                         |
+----------------------------------------------+
| applications_databaseapp                     |
| applications_remoteapp                       |
| assets_adminuser                             |
| assets_asset                                 |
| assets_asset_labels                          |
...

八、启动jumpserver服务

cd /opt/jumpserver
/opt/jumpserver/jms start -d  #-d表示后台运行 start|stop|restart|status

验证jumpserver初始化页面

192.168.136.65:8080

九、部署koko组件

        koko组件实现了SSH Server 和 Web Terminal Server的组件,提高SSH和WebSocket接口,使用Paramiko和Flask开发,可以让我们在线去像xshell一样在网页上去敲命令。他是golang编程语言开发的。和之前的coco组件(py写的)相比,性能更高。

cd /opt
wget https://github.com/jumpserver/koko/releases/download/v2.1.0/koko-v2.1.0-linux-amd64.tar.gz
tar -zxvf koko-v2.1.0-linux-amd64.tar.gz
cd koko-v2.1.0-linux-amd64/
cp config_example.yml config.yml
vim config.yml

##填入获取的BOOTSTRAP_TOKEN,将redis的注释删掉###

[root@jumpserver koko-v2.1.0-linux-amd64]# egrep -v "^#|^$" config.yml
CORE_HOST: http://127.0.0.1:8080
BOOTSTRAP_TOKEN: 1iTfoBKVFv13PtSg
REDIS_HOST: 127.0.0.1
REDIS_PORT: 6379
REDIS_PASSWORD:
REDIS_CLUSTERS:
REDIS_DB_ROOM:

./koko -d  #启动koko服务

十、部署guacamole组件

        Apache 跳板机项目,Jumpserver使用其他组件实现RDP功能,Jumpserver并没有修改其他代码而是添加了额外的插件,支持Jumpserver调用。(这里的RDP就是远程桌面协议,通过浏览器就能操作后台服务器)

        官网下载链接:Apache Guacamole™: 1.2.0

10.1 下载guacamole-server及ssh-forward

cd /opt
wget -O docker-guacamole-v2.1.1.tar.gz https://github.com/jumpserver/docker-guacamole/archive/master.tar.gz
tar -xf docker-guacamole-v2.1.1.tar.gz

#解压后目录名为docker-guacamole-master,目录下有三个文件#
[root@jumpserver opt]# ls /opt/docker-guacamole-master/
Dockerfile    guacamole.properties     etc     

cd /opt/docker-guacamole-master/
wget http://download.jumpserver.org/public/guacamole-server-1.2.0.tar.gz  #下载guacamole-server
tar -zxvf guacamole-server-1.2.0.tar.gz

wget http://download.jumpserver.org/public/ssh-forward.tar.gz--2020-08-09 14:33:54--  http://download.jumpserver.org/public/ssh-forward.tar.gz  #下载ssh-forward
tar -zxvf ssh-forward.tar.gz 

cd /opt/docker-guacamole-master/guacamole-server-1.2.0  #进入源码包

yum -y install cairo-devel libjpeg-turbo-devel libjpeg-devel libpng-devel libtool uuid-devel freerdp-devel pango-devel libssh2-devel libtelnet-devel libvncserver-devel libwebsockets-devel pulseaydio-libs-devel openssl-devel libvorbis-devel libwebp-devel  #安装依赖

10.2 安装ffmpeg工具

ffmpeg工具是用来处理媒体文件

yum -y install epel-release 

rpm -v --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

yum -y install ffmpeg ffmpeg-devell

10.3 编译安装guacamole

cd /opt/docker-guacamole-master/guacamole-server-1.2.0  #进入源码包
./configure --with-init-dir=/etc/init.d  #编译
make && make install  #编译安装

10.4 安装java环境

yum -y install java-1.8.0-openjdk

cd /opt
wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.74/bin/apache-tomcat-9.0.74.tar.gz
tar -xf apache-tomcat-9.0.74.tar.gz
mv apache-tomcat-9.0.74 tomcat9
rm -rf /opt/tomcat9/webapps/*

cd /opt/docker-guacamole-master/
wget http://download.jumpserver.org/release/v2.1.1/guacamole-client-v2.1.1.tar.gz  #guacamole-clent里有一个war包和jar包
tar -xf guacamole-client-v2.1.1.tar.gz

##更改tomcat配置文件###
sed -i 's/Connector port="8080"/Connector port="8081"/g' /opt/tomcat9/conf/server.xml
echo "java.util.logging.ConsoleHandler.encoding = UTF-8" >> /opt/tomcat9/conf/logging.properties

###3个软链接###
ln -sf /opt/docker-guacamole-master/guacamole-client-v2.1.1/guacamole-1.0.0.war /opt/tomcat9/webapps/ROOT.war
ln -sf /opt/docker-guacamole-master/guacamole-client-v2.1.1/guacamole-auth-jumpserver-1.0.0.jar /config/guacamole/extensions/guacamole-auth-jumpserver-1.0.0.jar
ln -sf /opt/docker-guacamole-master/guacamole.properties /config/guacamole/guacamole.properties

10.5 设置guacamole环境

./bashrc是一个类似与profile的环境变量配置文件。在/root目录下使用 ls --all可以查看,默认情况下隐藏。

export JUMPSERVER_SERVER=http://127.0.0.1:8080    
echo "export JUMPSERVER_SERVER=http://127.0.0.1:8080" >> ~/.bashrc
export BOOTSTRAP_TOKEN=Ovn181zT7q7a8Die
echo "export B00TSTRAP_TOKEN=Ovn181zT7q7a8Die" >> ~/.bashrc
export JUMPSERVER_KEY_DIR=/config/guacamole/keys
echo "export JUMPSERVER_KEY_DIR=/config/guacamole/keys" >> ~/.bashrc
export GUACAMOLE_HOME=/config/guacamole
echo "export GUACAMOLE_HOME=/config/guacamole" >> ~/.bashrc
export GUACAMOLE_LOG_LEVEL=ERROR
echo "export GUACAMOLE_LOG_LEVEL=ERROR" >> ~/.bashrc
export JUMPSERVER_ENABLE_DRIVE=true
echo "export JUMPSERVER_ENABLE_DRIVE=true" >> ~/.bashrc

参数含义:

JUMPSERVER_SERVER 指core访问的地址

 BOOTSTARAP_TOKEN一定要改为自己的,如果忘记就去jumpserver下的config.yml里去找

JUMPSERVER_KEY_DIR 认证成功后key存放目录

GUACAMOLE_HOME 为guacamole.properties配置文件所在目录

GUACAMOLE_LOG_LEVEL 为生成日志等级

JUMPSERVER_ENABLE_DRIVE 为rdp协议挂载共享盘

10.6 启动tomcat和guacamole

/etc/init.d/guacd start  #启动服务
/opt/tomcat9/bin/startup.sh  #启动tomcat

十一、lina/luna模块

lina是属于前端模块,负责页面的展现,luna现在是web terminal 前端、计划前端页面都有该项目提供。jumpserver只提供api,不再负责后台渲染html,他和lina结合可以实现网页上命令行界面的终端。

11.1 新建Linux用户nginx

useradd -M -s /sbin/nologin nginx

11.2 安装lina/luna

cd /opt
wget https://github.com/jumpserver/lina/releases/download/v2.1.0/lina-v2.1.0.tar.gz
wget https://github.com/jumpserver/luna/releases/download/v2.1.1/luna-v2.1.1.tar.gz
tar -zxvf lina-v2.1.0.tar.gz
tar -zxvf luna-v2.1.1.tar.gz
mv lina-v2.1.0 lina
mv luna-v2.1.1 luna
chown -R nginx:nginx lina  #改变他的属主属组,让他归nginx管理
chown -R nginx:nginx luna  #改变他的属主属组,让他归nginx管理

十二、编译安装nginx、nginx-module-vts

12.1 下载nginx

cd /opt
wget http://nginx.org/download/nginx-1.22.0.tar.gz
tar -zxvf nginx-1.22.0.tar.gz
wget https://gitcode.net/mirrors/vozlt/nginx-module-vts/-/archive/master/nginx-module-vts-master.zip  #可能会报错,但链接是没问题的,需要去windows主机下载然后传到/opt目录下
unzip nginx-module-vts-master.zip

yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel make

cd /opt/nginx-1.22.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/opt/nginx-module-vts-master/
make && make install

nginx -V  #查看nginx安装信息
nginx -t  #测试ngixn,返回nginx状态,带有successful为成功

11.2 更改nginx.conf

vim /usr/local/nginx/conf/nginx.conf 

 直接复制即可,无需更改,黏贴格式出错请使用vim黏贴模式,:set paste。

#user  nobody;
worker_processes  1;
 
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid        logs/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
 
http {
    include       mime.types;
    default_type  application/octet-stream;
    vhost_traffic_status_zone;                  #流量状态监控
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
 
    #access_log  logs/access.log  main;
log_format main '{ "@timestamp": "$time_local", '
'"@fields": { '
'"uri":"$request_uri",'
'"url":"$uri",'
'"upstream_addr":"$upstream_addr",'
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"body_bytes_sent": "$body_bytes_sent", '
'"host":"$host",'
'"server_addr":"$server_addr",'
'"request_time": "$request_time", '
'"request_time":"$request_time",'
'"status":"$status",'
'"request": "$request", '
'"request_method": "$request_method", '
'"size":$body_bytes_sent,'
'"upstream_time":"$upstream_response_time"'
'"http_referrer": "$http_referer", '
'"body_bytes_sent":"$body_bytes_sent", '
'"http_x_forwarded_for": "$http_x_forwarded_for", '
'"http_user_agent": "$http_user_agent" } }';
    sendfile        on;
    #tcp_nopush     on;
 
    #keepalive_timeout  0;
    keepalive_timeout  65;
 
    #gzip  on;
 
    server {
        listen       80;
        server_name  localhost;
 
        #charset koi8-r;
 
        #access_log  logs/host.access.log  main;
 
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
        #error_page  404              /404.html;
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
 
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
 
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
 
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
 
 
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;
 
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
 
 
    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;
 
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;
 
    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;
 
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;
 
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
 
}
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
cd /usr/local/sbin/
./nginx   #开启服务

11.3 验证nginx

192.168.136.65

192.168.136.65/status

11.4 监控列表解释

监控列表各项信息
Server main 主服务器
**Host:**主机名
**Version:**版本号
**Uptime:**服务器运行时间
Connections active:当前客户端的连接数 reading:读取客户端连接的总数 writing:写入客户端连接的总数
Requsts accepted:接收客户端的连接总数 handled:已处理客户端的连接总数 Total:请求总数 Req/s:每秒请求的数量
Shared memory:共享内存 name:配置中指定的共享内存名称 maxSize:配置中指定的共享内存的最大限制 usedSize:共享内存的当前大小 usedNode:共享内存中当前使用的节点数
Server zones 服务器区域
zone:当前区域
Requests Total:请求总数 Req/s:每秒请求数 time:时间
Responses:状态码数量 1xx、2xx、3xx、4xx、5xx:表示响应不同状态码数量 Total:响应状态码的总数
Traffic表示流量 Sent:发送的流量 Rcvd:接收的流量 Sent/s:每秒发送的流量 Rcvd/s:每秒接收的流量
Cache表示缓存 Miss:未命中的缓存数 Bypass:避开的缓存数 Expirde:过期的缓存数 Stale:生效的缓存数 Updating:缓存更新的次数 Revalidated:重新验证的缓存书 Hit:缓存命中数 Scarce:未达缓存要求的请求次数Total:总数

十二、再次更改nginx配置

vim /usr/local/nginx/conf/nginx.conf

实际上之只更改了server部分,为了大家方便复制,我把整个文件拷贝下来。黏贴格式出错请使用vim黏贴模式,:set paste。

worker_processes  1;

events {
    worker_connections  1024;
}
 

http {
    include       mime.types;
    default_type  application/octet-stream;
    vhost_traffic_status_zone;                  #流量状态监控
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
 
    #access_log  logs/access.log  main;
log_format main '{ "@timestamp": "$time_local", '
'"@fields": { '
'"uri":"$request_uri",'
'"url":"$uri",'
'"upstream_addr":"$upstream_addr",'
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"body_bytes_sent": "$body_bytes_sent", '
'"host":"$host",'
'"server_addr":"$server_addr",'
'"request_time": "$request_time", '
'"request_time":"$request_time",'
'"status":"$status",'
'"request": "$request", '
'"request_method": "$request_method", '
'"size":$body_bytes_sent,'
'"upstream_time":"$upstream_response_time"'
'"http_referrer": "$http_referer", '
'"body_bytes_sent":"$body_bytes_sent", '
'"http_x_forwarded_for": "$http_x_forwarded_for", '
'"http_user_agent": "$http_user_agent" } }';
    sendfile        on;
    #tcp_nopush     on;
 
    #keepalive_timeout  0;
    keepalive_timeout  65;
 
    #gzip  on;
    server {
        listen       80;
        client_max_body_size 100m; #录像和文件上传大小限制
        #charset koi8-r;
 
        #access_log  logs/host.access.log  main;
 
        location /ui/ {
            try_files $uri / /index.html;
            alias /opt/lina/;
        }
        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
        location /luna/ {
            try_files $uri / /index.html;
            alias /opt/luna/;   #luna路径,如果修改安装目录,此处需要修改
        }
        location /media/ {    #静态文件处理
        add_header Content-Encoding gzip;
        root /opt/jumpserver/data/; #录像位置,如果修改安装目录,此处需要修改
 
        }
        location /static/ {
        root /opt/jumpserver/data/;
        }
        location /koko/ {  #当我们请求koko,他会通过proxy_pass进行反向代理
        proxy_pass http://localhost:5000;
        proxy_buffering off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        access_log off;
        }
        location /guacamole/{
        proxy_pass http://localhost:8081/ ;
        proxy_buffering off;
        proxy_http_version 1.1;
        proxy_set_header upgrade $http_upgrade;
        proxy_set_header Connection $http_connection;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        access_log off;
        }
        location /ws/{
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://localhost:8070;
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        }
        location /api/{
        proxy_pass http://localhost:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        location /core/ {
        proxy_pass http://localhost:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        location / {
        rewrite ^/(.*)$ /ui/$1 last;
        }
 
} 
}

重启nginx

cd /usr/local/sbin/nginx
./nginx

如果重启nginx后出现以下报错

nginx: [emerg] "server" directive is not allowed here in /usr/local/nginx/conf/nginx.conf:1

检查格式,通常就是少了一个括号或者多一个括号。

十三、访问jumpserver

192.168.136.65

此时不再是8080端口,而是80端口,因为被nginx代理,默认用户名密码均为admin

十四、问题汇总

14.1 pip包路径

[root@jumpserver wheels]# cd /opt/py3/lib/python3.6/site-packages

'pidfile' has no attribute 'TimeoutPIDLockFile' pidfile模块没有TimeoutPIDLockFile属性,我安装另一个教程会出现此报错,无法解决,重新开了一台虚拟机,按照我的本文教程不会出现该问题。

14.2 nginx占用及重启

nginx: [emerg] still could not bind()报错表示80端口被占用

查看端口占用情况

netstat -anp | grep 80

使用kill -9 杀死进程也没用,nginx:worker 或者nginx:master一直自动重启占用80端口

###解决方法###
cd /usr/local/sbin/nginx
pkill nginx
./nginx

14.3 mysql导入数据错误

python3 /opt/jumpserver/apps/manage.py makemigrations   报错

python3 /opt/jumpserver/apps/manage.py migrate

mysql数据库密码纯数字错误

###解决方法###
改密码解决方法,提前避免改为问题,密码需要有英文字母和数字组合。
如果你前面mysql密码设置的跟我一样不会出现该问题。

(jum_venel) [root@jumpserver apps]# mysqladmin -ujumpserver -p password
Enter password: 
New password: 
Confirm new password: 

14.4 pip3 install virtualenv 报错

缺少openssl工具,需要卸载python3重新编译

###解决方法###
rm -rf /usr/local/python3.6/  #卸载原先的python3.6
yum install openssl openssl-devel -y
cd /etc/python
./configure --prefix=/usr/local/python3.6
 make -j3 && make install

14.5 重启主机后启动jumpserver

由于没有设置jms、nginx开机自启动,所以没吃开机需要手动启动

###解决方法###
source /usr/local/jmp_venvl/bin/activate
/opt/jumpserver/jms start -d
./usr/local/sbin/nginx

十五、参考链接

手动部署jumpserver堡垒机(完整过程+常见错误)_IT.cat的博客-CSDN博客

Nginx编译安装+监控模块Nginx-module-vts_IT.cat的博客-CSDN博客

Linux操作文档——jumpserver平台系统部署与使用

猜你喜欢

转载自blog.csdn.net/weixin_48878440/article/details/130836286