该项目适合中小型公司日志查询工作。大型公司可以使用elk等。该系统其实就是调用了absible命令去查日志,然后把输出的信息输到页面查看。
本工具是本人从 0 - 1 全程开发的,还有很多地方需要优化。
项目由来:
本人曾任职于一家移动外包公司,服务器用的是内网,出口有移动的防火墙,所以相对云服务器绝对的安全。内部组件基本都是内网通信。只有对外的web页面或者后台做了外网域名的端口映射。
因为移动限制了研发登录内网机器查看日志,elk也是有的,但是接入麻烦,两头对接,降低效率的同时也得不到自己想要的日志。只有直接使用系统命令去查找才能看到最原始的日志,才方便问题排查。
故开发了此组件,便于研发查找原始日志。虽然目前本人已离职,但据听说该组件还一直在使用,虽然已无人维护更新迭代,但足以支撑目前那个项目的使用。
项目代码git地址:
https://github.com/MYF12/logsquery3.0.git
有问题可联系本人QQ:1016401546
维护手册
作者:陈土锋
日期:2020年6月11日
目录
前言... 1
一、系统底层逻辑说明... 2
二、环境说明... 2
三、系统搭建... 2
3.1 安装Python3. 2
3.1.1 安装依赖环境... 2
3.1.2下载Python3. 3
3.1.3 安装Python3. 3
3.1.4 建立Python3和pip3的软链:. 3
3.1.5 并将/usr/local/python3/bin加入PATH. 3
3.2 安装虚拟环境... 4
3.2.1 生产环境虚拟环境包路径:... 4
3.2.2 先安装distlib-0.3.0.zip. 4
3.2.3 创建虚拟环境... 5
3.3 安装Django. 6
3.4 测试项目是否正常运行... 7
3.4.1 项目部署... 7
3.4.2 项目测试... 8
四、nginx+uwsgi+Django代理项目... 8
4.1 安装uwsgi 8
4.2 配置uwsgi 9
4.3 启动uwsgi 10
4.4 配置nginx 代理Django. 10
五、Django3.0.7安装... 12
1、该程序是根据xxxxxx目前系统管理层面开发而成,故仅适用于xxxxxx系统平台。
2、该系统开发初心为减少运维协助研发查询线上生产日志、线上配置和线上其他环境而开发出来的。
3、架构使用了Python3+Django+uwsgi+nginx 基础架构。
4、底层调用ansible命令
1.1 前端代码通过form表单提交用户交互信息到后端。
1.2 后端接受到输入信息,经过逻辑处理之后调用服务器的ansible命令来执行远程命令。
1.3 远程命令返回的结果,再通过文本格式展示到前端页面供用户查看。
1.4 如果文本文件行数过多,则用户可以通过下载的连接下载到文本到本地查看查看。
2.1 服务器安装ansible命令(前提)
2.2 ansible服务器必须能通过下面命令格式去执行远程命令:
如:ansible slivr --sudo -m shell -a "ls -l "
如果是root用户则在sudoer文件加入root用户sudo权限即可,这样无需修改代码。
2.3 安装Python3
2.4 安装虚拟环境
2.5 安装Django 1.8 版本(最新版Django3.5需要改下代码的URL转发方式)
输入命令:yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
1.进入opt文件目录下,cd opt/
2.下载python3 (可以到官方先看最新版本多少)
输入命令 wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz
安装在/usr/local/python3(具体安装位置看个人喜好)
(1)创建目录: mkdir -p /usr/local/python3
(2)解压下载好的Python-3.x.x.tgz包(具体包名因你下载的Python具体版本不不同⽽而不不同,如:我下载的是Python3.7.1.那我这里就是Python-3.7.1.tgz)
输入命令 tar -zxvf Python-3.7.1.tgz
解压后出现python的文件夹
进入解压后的目录,编译安装。(编译安装前需要安装编译器yum install gcc)
(3)进入python文件夹,生成编译脚本(指定安装目录):
cd Python-3.7.1
./configure --prefix=/usr/local/python3
#/usr/local/python3为上面步骤创建的目录
(4)编译:make
(5)编译成功后,编译安装:make install
安装成功:
(6)检查python3.7的编译器:/usr/local/python3/bin/python3.7
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
(1)vim /etc/profile
(2)按“I”,然后贴上下面内容:
# vim ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/usr/local/python3/bin
export PATH
source ~/.bash_profile
使用pip3下载下面命令:
vim requirements.txt
appdirs==1.4.3
distlib==0.3.0
filelock==3.0.12
importlib-metadata==1.6.0
importlib-resources==1.4.0
pbr==5.4.5
setuptools==39.0.1
six==1.14.0
stevedore==1.32.0
virtualenv==20.0.18
virtualenv-clone==0.5.4
virtualenvwrapper==4.8.2
zipp==3.1.0
#下载
pip3 download requirements.txt
下载完之后可以看到下面这些包:
appdirs-1.4.3-py2.py3-none-any.whl
distlib-0.3.0.zip
filelock-3.0.12-py3-none-any.whl
importlib_metadata-1.6.0-py2.py3-none-any.whl
importlib_resources-1.4.0-py2.py3-none-any.whl
pbr-5.4.5-py2.py3-none-any.whl
six-1.14.0-py2.py3-none-any.whl
stevedore-1.32.0-py2.py3-none-any.whl
virtualenv-20.0.18-py2.py3-none-any.whl
virtualenv_clone-0.5.4-py2.py3-none-any.whl
virtualenvwrapper-4.8.2-py2.py3-none-any.whl
zipp-3.1.0-py3-none-any.whl
unzip distlib-0.3.0.zip
cd distlib-0.3.0
python3 setup.py build
python3 setup.py install
再安装所有的whl包:
pip3 install *.whl
mkdir /root/.virtualenvs
#用locate virtualenvwrapper.sh 找出这个文件的路径,一般在安装的python3 bin目录下
vim ~/.bashrc
export WORKON_HOME=/root/.virtualenvs
#加载环境
source /usr/local/python3/bin/virtualenvwrapper.sh
vim /usr/local/python3/bin/virtualenvwrapper.sh
找到VIRTUALENVWRAPPER_PYTHON关键字,在下面的if上面添加红色代码,python路径要对。
VIRTUALENVWRAPPER_PYTHON=/usr/local/python3/bin/python3
if [ "${VIRTUALENVWRAPPER_PYTHON:-}" = "" ]
then
source ~/.bashrc
做virtualenv命令软连接:否则后续创建虚拟环境会报错
ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv
[root@ansible-server2 dwlirui2]# pip3 list --可以看到已经安装了下面的包
Package Version
------------------- -------
appdirs 1.4.3
distlib 0.3.0
filelock 3.0.12
importlib-metadata 1.6.0
importlib-resources 1.4.0
pbr 5.4.5
pip 20.0.2
setuptools 39.0.1
six 1.14.0
stevedore 1.32.0
virtualenv 20.0.18
virtualenv-clone 0.5.4
virtualenvwrapper 4.8.2
zipp 3.1.0
[root@ansible-server2 dwlirui2]# mkvirtualenv -p python3 env1
创建成功之后你会默认进入虚拟环境,如创建env1:
[root@ansible-server2 dwlirui2]# mkvirtualenv -p python3 env1
created virtual environment CPython3.6.5.final.0-64 in 1210ms
creator CPython3Posix(dest=/root/.virtualenvs/env3, clear=False, global=False)
seeder FromAppData(download=False, pip=latest, setuptools=latest, wheel=latest, via=copy, app_data_dir=/root/.local/share/virtualenv/seed-app-data/v1.0.1)
activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
virtualenvwrapper.user_scripts creating /root/.virtualenvs/env3/bin/predeactivate
virtualenvwrapper.user_scripts creating /root/.virtualenvs/env3/bin/postdeactivate
virtualenvwrapper.user_scripts creating /root/.virtualenvs/env3/bin/preactivate
virtualenvwrapper.user_scripts creating /root/.virtualenvs/env3/bin/postactivate
virtualenvwrapper.user_scripts creating /root/.virtualenvs/env3/bin/get_env_details
可以看到你已经进入虚拟环境env1,这个虚拟环境里面安装的软件和外面环境分开的
(env1) [root@ansible-server2 dwlirui2]#
通过旧的虚拟环境导出来的包:存放到requirements.txt文件里面。
旧环境登陆虚拟环境执行导出命令:pip3 freeze >requirements.txt
cat requirements.txt --下载如下包
certifi==2020.4.5.1
chardet==3.0.4
Django==1.8.2
idna==2.9
requests==2.23.0
urllib3==1.25.8
然后找一台测试环境能联网的机器下载这些包:
[root@vm44 django_instaa]# pip3 download -r requirements.txt
[root@vm44 django_instaa]# ls --总共下载了下面这么多包
backcall-0.1.0.tar.gz idna-2.9-py2.py3-none-any.whl
backcall-0.1.0.zip requests-2.23.0-py2.py3-none-any.whl
certifi-2020.4.5.1-py2.py3-none-any.whl requirements.txt
chardet-3.0.4-py2.py3-none-any.whl
distlib-0.3.0.zip urllib3-1.25.8-py2.py3-none-any.whl
Django-1.8.2-py2.py3-none-any.whl
scp * [email protected]:/data/python_install/django_install --把包传到远程离线服务器
离线服务器登陆虚拟环境
workon env1 --以下命令均在虚拟环境执行
cd /data/python_install/django_install
离线虚拟环境先安装:backcall-0.1.0.zip,distlib-0.3.0.zip
以安装backcall-0.1.0.zip为例:
unzip backcall-0.1.0.zip
cd backcall-0.1.0
python3 setup.py build
python3 setup.py install
再安装所有的whl包:
pip3 install *.whl
安装完了之后,确定是否存在下面这些包:
[root@ansible-server2 logs]# workon env1
(env1) [root@ansible-server2 logs]# pip list
Package Version
---------- ----------
backcall 0.1.0
certifi 2020.4.5.1
chardet 3.0.4
distlib 0.3.0
Django 1.8.2
idna 2.9
pip 20.0.2
requests 2.23.0
setuptools 46.1.3
urllib3 1.25.8
uWSGI 2.0.18
wheel 0.34.2
我是通过虚拟环境搭建这个的,nginx安装到服务器上面,uwsgi和Django部署到虚拟环境上面。uwsgi和Django在虚拟环境启动。nginx 在服务器层面启动。
项目代码已经备份到xx.xx.xx.xx:/share/logs_bak/xx.xx.xx.xx/ logsquerybak/logsquery.20200601.tar.gz
我的Django项目部署情况:
部署路径:
/biao/hly_yw_project/
即将logsquery.20200601.tar.gz 直接解压到/biao/hly_yw_project 目录。
manage.py 文件路径:/biao/hly_yw_project/logsquery/manage.py
wsgi.py 文件路径:/biao/hly_yw_project/logsquery/logsquery/wsgi.py
settings.py 文件路径:/biao/hly_yw_project/logsquery/logsquery/settings.py
查询出来的文件放到这里:
/biao/hly_yw_project/logsquery/queryapp/static/files/
目前只保留7天的文件:
0 2 * * * find /biao/hly_yw_project/logsquery/queryapp/static/files -name "*.txt" -mtime +7 -type f |xargs rm -f
项目结构是这样的:
1、确保Django项目能够正常运行,即能够用Python3 manage.py runserver 0.0.0.0:8000 运行。
(env1) [root@ansible-server2 logs]# cd /biao/hly_yw_project/logsquery/
(env1) [root@ansible-server2 logs]# Python3 manage.py runserver 0.0.0.0:8000
用浏览器访问ip:8000看下能否正常访问下面页面。
uwsgi是wsgi协议的实现服务。
我是离线安装的。
下载 uwsgi-2.0.18.tar.gz
可以找一台能够联网的服务器通过pip download 命令来下载,传到离线服务器上面。
解压安装:(在虚拟环境里面安装)
workon env1
tar zxf uwsgi-2.0.18.tar.gz
cd uwsgi-2.0.18
python3 setup.py build
python3 setup.py install
pip list 查看是否安装成功
uWSGI 2.0.18
mkdir /etc/uwsgi_conf/
cat /etc/uwsgi_conf/uwsgi.ini
# uwsig使用配置文件启动
[uwsgi]
# 项目所在的根目录
chdir=/biao/hly_yw_project/logsquery
# 指定项目的application,区别于启动命令--wsgi-filemysite/wsgi.py
#logsquery自己应用的名字
module=logsquery.wsgi:application
#the local unix socket file than commnuincate to Nginx
# 指定sock的文件路径,这个sock文件会在nginx的uwsgi_pass配置,用来nginx与uwsgi通信
# 支持ip+port模式以及socket file模式
#socket=/etc/uwsgi_conf/uwsgi.sock
socket=127.0.0.1:9050
# 进程个数
processes = 8
# 每个进程worker数
workers=5
procname-prefix-spaced=queryapp # uwsgi的进程名称前缀
py-autoreload=1 # py文件修改,自动加载
# 指定IP端口,web访问入口
http=0.0.0.0:9051
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 启用主进程
master=true
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置一个超时,用于中断那些超过服务器请求上限的额外请求
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/var/log/uwsgi_conf/uwsgi.log
# uWSGI进程号存放
pidfile=/etc/uwsgi_conf/uwsgi.pid
#monitor uwsgi status 通过该端口可以监控 uwsgi 的负载情况
# 支持ip+port模式以及socket file模式
# stats=%(chdir)/uwsgi_conf/uwsgi.status
cd /etc/uwsgi_conf/
uwsgi --ini uwsgi.ini
停止:
uwsgi --stop uwsgi.pid
nginx添加一个server:
server {
listen 8000;
server_name xxxxxx;
#注释下面配置,同时支持https和http访问
#ssl on;
#access_log off;
access_log /var/log/nginx/nginx.log;
error_log /var/log/nginx/nginx.log;
charset utf-8;
client_max_body_size 100M;
location /static{
alias /biao/hly_yw_project/logsquery/queryapp/static;
}
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass 0.0.0.0:9050;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
uwsgi_read_timeout 600;
uwsgi_send_timeout 600;
uwsgi_connect_timeout 600;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
#使用497状态重写到http上面
}
重启nginx或者重载nginx
nginx -s reload
页面访问:
http://ip:8000即可访问Django项目
因1.8.2版本有漏洞,需要升级到最新版。最新版有些模块不兼容,代码也有些地方相对1.8.2的有改动。
Django3.0的需要用这个包:
xx.xx.x.xx: /biao/hly_yw_project/logsquery.django3.0.7.tar.gz
其他应用安装方式不变,安装Django3.0.7方式。
安装包备份目录:
xx.x.xx.xx: /usr/local/vvm/logs/django
xx.xx.xx.xx:/share/logs_bak/xx.xx.xx.xx/django
进入虚拟环境:
workon env1
#解压
tar zxf django3.0.tar.gz
#安装
pip install *whl
其他配置参考1.8.2的