关闭宝塔面板强制要求安装一键套件以及解决文件保存失败问题

宝塔面板的安装必须要保证服务器目前非常干净,就是说:系统刚装好、服务器刚买好这种什么软件都还没安装的情况下,直接安装宝塔面板,他就可以帮你把一切包干,不用你再进行安装什么反向代理、数据库什么的了。

但是,但是,对于一个重来没有使用过宝塔面板的人来说,可能电脑上已经安装了自己的数据库、nginx什么的,再安装宝塔的话,安装是会成功,但是一打开宝塔面板就会提示安装套件LNMP或则LAMP了,这些套件里面的内容就有我们已经安装过的软件,而我们又不想卸载以前的东西,毕竟可能运行了很久怕卸载了出问题,这时候就蒙了,不知道该怎么办,虽然这个提示是可以关闭的,但是每次打开都提示,对于强迫症患者来说简直就是一个灾难!就没有办法让宝塔不提示吗?

 ,如果进行了仔细研究,会发现,还是很好解决的。

一、寻找原因

既然宝塔面板在打开的时候就会提示我们安装这些套件,那说明肯定请求了接口去获取是否安装了这些软件了。说干就干,打开宝塔面板,点击 F12,直接进入network面板查看请求详情:

可以看到,通过请求接口 ajax?action=CheckInstalled 服务端返回一个 false ,告知前端,服务端还没有安装套件内容。这种时候前端就必然会提示安装了。

既然知道了接口地址,直接进入宝塔源码 https://github.com/aaPanel/BaoTa (源码链接你可以在宝塔官网bt.cn的页脚处找到)去寻找服务端如何判断是否安装了这些套件内容的。

进入源代码,class 目录里即为大多数接口的实现代码。经过在目录里寻找,赫然看到一个 ajax.py 源码文件,这个文件正好和请求的接口地址对应上,没错,直接打开它。在这个文件里搜索CheckInstalled,找到对应方法,代码如下:

 
  1. #检查是否安装
  2. def CheckInstalled(self,get):
  3. checks = ['nginx','apache','php','pure-ftpd','mysql']
  4. import os
  5. for name in checks:
  6. filename = public.GetConfigValue('root_path') + "/server/" + name
  7. if os.path.exists(filename): return True
  8. return False

可以看到,只要你安装了checks数组里的任何一个软件,都会直接返回True,终止判断。再进一步看看是判断的哪一个目录。进入public类的GetConfigValue方法看看这个目录是哪里:

 
  1. def GetConfigValue(key):
  2. '''
  3. 取配置值
  4. '''
  5. config = GetConfig()
  6. if not key in config.keys(): return None
  7. return config[key]
  8.  
  9. # 再跟进到 GetConfig() 方法↓↓
  10. def GetConfig():
  11. '''
  12. 取所有配置项
  13. '''
  14. path = "config/config.json"
  15. if not os.path.exists(path): return {}
  16. f_body = ReadFile(path)
  17. if not f_body: return {}
  18. return json.loads(f_body)

发现读取的是这个配置文件,打开配置文件代码:

 
  1. {
  2. "language": "Simplified_Chinese",
  3. "title": "宝塔Linux面板",
  4. "brand": "宝塔",
  5. "product": "Linux面板",
  6. "home": "http://www.bt.cn",
  7. "root_path": "/www", <-- 这玩意儿
  8. "setup_path": "/www/server",
  9. "logs_path": "/www/wwwlogs",
  10. "recycle_bin": true,
  11. "template": "default"
  12. }

最终找到了配置值,再结合判断的代码,不难得到这些软件的安装位置在:

 
  1. # xxx 就是对应软件的名字
  2. /www/server/xxx

二、取消安装提示

通过上一节的分析,不难发现,是否安装对应软件即判断是否存在对应文件。我们希望不提示,那就直接在 /www/server/ 目录下新建一个文件夹 nginx。这样就不会提示了,就像这样:

注意: 虽然我们通过这样的方式让安装套件不再提示了,但当我们点击到对应 【网站】、【FTP】、【数据库】菜单界面的时候,也会对应提示我们没有安装这些软件。如果你在安装宝塔前安装过这些软件,那么宝塔提供的这些管理功能也无法管理到自己安装的软件上,所以我们可以把对应菜单按钮给隐藏了,只需要进入目录/www/server/panel/config 编辑menu.json文件,把你不需要的菜单去除就可以了。如果你执意要想让宝塔能管理到这些早前就安装好的软件,那只有自己研究了。

三、修复文件保存的问题

这个问题通常来说不会出现,要出现的前提就是:你没安装宝塔提示的套件内容、并且你要保存的文件是一个配置文件。这一小节将解决【修改了nginx配置文件后保存失败】的问题,下面进入正题。

当我们编辑好文件,点击保存时,前端调用了一个保存接口 files?action=SaveFileBody 来保存文件, 我们直接打开源代码,查看保存文件是怎么实现的,在源码的files.py里搜索SaveFileBody迅速定位实现方法:

 
  1. # 这个方法代码稍稍有点长。
  2. # 不过很简单,方法实现思路如下:
  3. # 1、禁止修改 不能修改文件.
  4. # 2、判断文件是否为(nginx和apache的)配置文件以及是否为用户配置文件
  5. # 3、备份源文件,写入新文件内容
  6. # 4、如果是配置文件,校验新的配置是否合法
  7.  
  8. # 保存文件
  9. def SaveFileBody(self, get):
  10.  
  11. # 1、禁止修改 不能修改文件.
  12. if ...
  13. if ...
  14.  
  15. # 2、判断文件是否为(nginx和apache的)配置文件以及是否为用户配置文件
  16. try:
  17. ...
  18. isConf = -1
  19. if os.path.exists('/etc/init.d/nginx') or os.path.exists('/etc/init.d/httpd'):
  20. isConf = get.path.find('nginx')
  21. if isConf == -1:
  22. isConf = get.path.find('apache')
  23. if isConf == -1:
  24. isConf = get.path.find('rewrite')
  25. if isConf != -1:
  26. public.ExecShell('\\cp -a '+get.path+' /tmp/backup.conf')
  27. data = ...
  28.  
  29. # 3、备份原文件,写入新文件内容
  30. if ...
  31. self.save_history(get.path)
  32. ...
  33. fp.write(data)
  34. fp.close()
  35.  
  36. # 4、如果是配置文件,校验新的配置是否合法
  37. if isConf != -1:
  38. isError = public.checkWebConfig()
  39. if isError != True:
  40. public.ExecShell('\\cp -a /tmp/backup.conf '+get.path)
  41. return public.returnMsg(False, 'ERROR:<br><font style="color:red;">'+isError.replace("\n", '<br>')+'</font>')
  42. public.serviceReload()
  43. if userini:
  44. public.ExecShell('chattr +i ' + get.path)
  45. public.WriteLog('TYPE_FILE', 'FILE_SAVE_SUCCESS', (get.path,))
  46. return public.returnMsg(True, 'FILE_SAVE_SUCCESS')
  47. except Exception as ex:
  48. return public.returnMsg(False, 'FILE_SAVE_ERR' + str(ex))

由于我们没有安装nginx,只是在/www/server/下新建了nginx目录骗过了宝塔,但文件保存这块,就骗不过了。通过代码阅读,第4点,检验新配置内容是否合法 就是出错的根本原因,进入public.checkWebConfig() 方法看一看它是如何校验的:

 
  1. #检查Web服务器配置文件是否有错误
  2. def checkWebConfig():
  3. ...
  4. if get_webserver() == 'nginx':
  5. result = ExecShell("ulimit -n 8192 ; /www/server/nginx/sbin/nginx -t -c /www/server/nginx/conf/nginx.conf")
  6. searchStr = 'successful'
  7. else:
  8. result = ExecShell("ulimit -n 8192 ; /www/server/apache/bin/apachectl -t")
  9. searchStr = 'Syntax OK'
  10. if result[1].find(searchStr) == -1:
  11. WriteLog("TYPE_SOFT", 'CONF_CHECK_ERR',(result[1],))
  12. return result[1]
  13. return True

可以看到,通过get_webserver() 获取到服务器使用的某种web软件,如果是nginx,则会使用 nginx命令进行验证 /www/server/nginx/conf/nginx.conf 文件的有效性,如果我们没有这些文件,这个命令自然也就没法正确运行了。

所以我们现在要做的就是把这些个文件都搞出来,怎么搞?且看我一一道来。

首先,我们要让命令本身是可用的,而由于我们没有通过宝塔来安装nginx,所以这个/www/server/nginx/sbin/nginx文件必然是没有的。为什么我们不通过宝塔安装,因为我们本身就已经安装了nginx啊,我们只要把我们真实的nginx命令路径拿到,然后在这这个路径对应的位置创建一个 链接文件 ,也就是使用ln命令来创建一个文件链接到另一个文件,使用这个文件就等同于使用真实的那个文件。

通过在控制台输入type nginx 可以拿到nginx命令本身所在目录,你看:

 
  1. root@microanswer-server:/home/microanswer# type nginx
  2. nginx is hashed (/usr/sbin/nginx) <-- 括号里这玩意儿
  3. root@microanswer-server:/home/microanswer#

其次,把这个命令所在的目录给建好。进入/www/server/nginx/ 目录,建一个sbin目录,进入sbin目录,建立 链接文件 :

 
  1. root@microanswer-server:/www/server/nginx/sbin# ln -s /usr/sbin/nginx nginx

这条命令里的/usr/sbin/nginx,就是通过type nginx获取到的。当你完成了这个链接文件的创建之后,就已经成功一大半了。

最后,我们将/www/server/nginx/conf/nginx.conf文件也准备好,重新返回到我们自己新建的nginx目录,建立一个conf目录,然后在这个目录里新建文件nginx.conf,这个文件的内容不能是空的,建议文件内容如下:

 
  1. events {
  2.  
  3. }

是的,就是这么一点内容。最后,我们建立的nginx目录结构看起来是这样的:

由于我们自己的nginx配置目录根本不可能是我们新建的这些文件夹,所以我们新建的这些对我们本身的nginx是不会有影响的,它们只是用来让宝塔觉得我们是安装了这些东西的。从而不会报错。

看看保存nginx配置文件还会不会出错:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍“宝塔面板mysql无法启动问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“宝塔面板mys...
这篇文章主要介绍“Docker中如何安装宝塔”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Docker中如何安装宝塔”文...
最近发现在宝塔的日志下看到很多垃圾支柱来爬行,这些垃圾蜘蛛爬行的日志很干扰我对于日志数据的查阅,今天查询了下关于宝塔面板下nginx屏蔽垃圾蜘蛛禁止抓取不影响火车头发布的方法,分享给大家去做下学习。希望对你
最近网站更换了服务器,安装了宝塔面板,安装好以后发现安装管理网站还是非常的直观方便的,但是有一点让我折腾了好久,那就是网站设置伪静态固定连接后,总是出现404错...
最近一段时间网站经常出现链接数据库错误,当然原因很简单,卡着了。查看宝塔面板发现负载状态经常是100%,内存使用率也是100%,CPU也不用说了,所以在网上查找...
本站之前有发表过两篇文章来通过宝塔面板优化服务器性能,《如何降低宝塔面板内存和CPU使用率,降低运行负载》以及《宝塔面板通过设置虚拟内存降低内存使用率及负载状态...
复制移动剪切的目录中不能有中文,否则会出错
不管是本地主机还是虚拟主机安装面板都是不能直接用生成的外网ip打开, windows替换ip成127.0.0.1 Linux替换ip成localhost 就可以访问了。
一键清除绑定限制 rm -f /www/server/panel/data/bind.pl
教你使用宝塔计划任务启动laravel调度器
宝塔面板是目前广受用户喜爱的服务器控制面板之一,很多用户的网站都是基于宝塔面板搭建,今天简单介绍下宝塔面板是如何安装WordPress的,方便新手用户快速部署。一、安装宝塔插件大部分使用宝塔面板的用户可能还不知
阿里云的ecs服务器(linux)安装宝塔
华为云服务器搭建宝塔Linux控制面板
新手使用阿里云esc服务器安装宝塔linux面板建站图文教程
购买完阿里云服务器后使用宝塔linux的搭建
【小白必看保姆级搭建个人网站】使用阿里云服务器与宝塔Linux快速建站
忘记宝塔密码,可以通过以下命令重置密码 cd /www/server/panel &amp;&amp; python tools.py panel testpasswd 如果提示多次登录失败,暂时禁止
阿里云服务器部署Django项目(Linux服务器、宝塔、纯新手)1.前言
宝塔快速部署Django项目1、宝塔快速部署Django项目1、软件商店搜索python,安装`python项目管理器`2、python项目管理器>项目管理>添加项目3、映射域名4、更改网站项目地址5、完成2、常见问题与解决方法1、宝塔快速部署Django项目1、软件商店搜索python,安装python
Python的语法十分简洁,简洁到只需要一行代码,即可输出意想不到的效果。一行代码到底有什么独特的魅力,下面一起来感受一下吧!1、画一个爱心作为一个Python程序员,自从接触Python就有种爱不释手的感觉,逐渐地被它的简洁高效的代码所吸引,所有我想用一行Python代码来画出一个心形向Python