如何优雅地替换掉宝塔面板

本文最后更新于:2022年7月2日 上午

前言

近两年来宝塔面板一直毁誉参半,虽然他对于小白来说操作友好,但是糟糕的代码质量和层出不穷的 Bug 也让其备受质疑,而最近的两个月其更是爆出了隐私问题。

由此我下定决心将其换掉。由于我用宝塔无非就是为了 LNMP 环境(其实主要是 Nginx),而我的所有应用都是 Docker 化的,所以我决定用 Nginx Proxy Manager(以下简称NPM)来作为替代,同时也可以用PHPMariaDBDocker 镜像来满足其他网站的环境需求。

搭建步骤

安装 DockerDocker Compose

参考 文档

编写 docker-compose.yaml

为了方便起见,我的容器都用的是 host 网络,如果对安全需求高建议单独创建一个 Docker 网络并仅将必要的端口映射出来。

version: "3"

services:
  app:
    image: jc21/nginx-proxy-manager:latest
    container_name: proxy
    restart: always
    network_mode: host
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    healthcheck:
      test: ["CMD", "/bin/check-health"]
      interval: 10s
      timeout: 3s

  php73:
    image: webdevops/php:7.3-alpine
    container_name: php73
    restart: always
    network_mode: host
    environment:
      - fpm.pool.listen=127.0.0.1:9073
    volumes:
      - ./data:/data

  php74:
    image: webdevops/php:7.4-alpine
    container_name: php74
    restart: always
    network_mode: host
    environment:
      - fpm.pool.listen=127.0.0.1:9074
    volumes:
      - ./data:/data

  data-all:
    image: mariadb:10
    container_name: data-all
    restart: always
    environment:
      - MARIADB_ROOT_PASSWORD=sample-password
    ports:
      - 127.0.0.1:3306:3306
    volumes:
      - ./database:/var/lib/mysql

如上述配置所示,我这里创建了两个 PHP 镜像分别是 7.37.4版本,分别监听本地的 9073 端口和 9074 端口,而数据库还是监听本地 3306 端口。

如果需要其他的 PHP 版本就按上述例子添加即可。为了方便非容器化的网站使用,我们需要创建以下文件:

例如我们将所有这些网站放在 ./data/static_websites/ 目录下。

# ./data/static_websites/php/enable-73.conf

location ~ [^/]\.php(/|$)
{
    try_files $uri =404;
    fastcgi_pass  127.0.0.1:9073;
    fastcgi_index index.php;
    include /data/static_websites/php/fastcgi.conf;
    include /data/static_websites/php/pathinfo.conf;
}
# ./data/static_websites/php/enable-74.conf

location ~ [^/]\.php(/|$)
{
    try_files $uri =404;
    fastcgi_pass  127.0.0.1:9074;
    fastcgi_index index.php;
    include /data/static_websites/php/fastcgi.conf;
    include /data/static_websites/php/pathinfo.conf;
}
# ./data/static_websites/php/fastcgi.conf

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
# ./data/static_websites/php/pathinfo.conf

set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
		set $real_script_name $1;
		set $path_info $2;
 }
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;

如果还有其他版本的 PHP 就按照上面的例子创建 enable-xx.conf 就可以了,注意修改 fastcgi_pass 的端口号就好。

上述的事情做完就可以一键启动了:

docker-compose up -d

NPM在线配置

首先访问 http://ip:81 登陆,默认账号和密码分别是 [email protected]changeme,登陆后修改默认密码。

NPM的界面还是比较简单的,如果是反代的话先添加 SSL 证书(支持自定义和 Let’s Encrypt,可 DNS 验证)。

添加 SSL 证书

然后直接在页面上添加 Proxy Hosts 即可。

添加 Proxy Hosts

添加 Proxy Hosts

这样 Save 并做好域名解析之后就可以通过域名访问了。

下面主要讲一下非容器化的静态和动态网页。

静态网页

首先将网页所有内容都放在 ./data/static_websites/your_site 目录下,然后在线创建一个 Proxy Hosts。

添加 Proxy Hosts

Forward Hostname / IPForward Port 可以是任意合法值,而 Cache Assets 一定不要勾选

SSL 配置与上述一样,而 Advanced 中的 Custom Nginx Configuration 需要填入:

location / {
    root /data/static_websites/your_site;
}

动态网页

将网页所有内容都放在 ./data/static_websites/your_dym_site 目录下,然后在线创建一个 Proxy Hosts。假设运行目录是 public 目录。

其他配置与静态网页一样,有需求可以勾选 Websockets Support。而 Advanced 中的Custom Nginx Configuration 需要填入:

# 运行目录
root /data/static_websites/your_dym_site/public;

index index.php;

include /data/static_websites/php/enable-74.conf;

# 伪静态规则
location / {
    if (!-e $request_filename){
        rewrite  ^(.*)$  /index.php?s=$1  last;   break;
    }
}

# 如果没有伪静态规则,一定要保证 location / 中有其他内容
# location / {
#     index index.php;
# }

数据库使用

数据库需要有一定 SQL 基础,也可以多加一个 phpmyadmin 容器来进行图形化操作。

先进入 Docker 内然后在进行处理:

docker exec -it data-all bash

然后连接数据库:

mysql -u root -p

密码是 docker-compose.yaml 中的 MARIADB_ROOT_PASSWORD,剩下的去看 菜鸟教程 吧。

比较常用的如下

# 创建用户
MariaDB [(none)]> CREATE USER [email protected]'%' IDENTIFIED BY 'mypassword';

# 创建数据库
MariaDB [(none)]> CREATE DATABASE mydatabase;

# 授予权限
MariaDB [(none)]> GRANT ALL ON mydatabase.* TO [email protected]'%';

以及导入数据

mysql -u root -p < data.sql

服务器备份

可以用 秋水逸冰 大佬的 备份脚本,配合 rclone 可以实现加密备份到任意的云存储(例如 OneDrive),配合 cron 定时执行即可。

如果不需要本地备份文件,可以用我 修改过的脚本,只改了两行,其他一模一样。

后记

宝塔面板有些小插件还是挺好用的,例如 WebhookSupervisor。但是谁都不想自己的服务器时时刻刻接入网警吧。。。建议还是尽早替换成本文的全Docker 方案,迁移成本并不高,而且服务器干净,不会有任何风险。


如何优雅地替换掉宝塔面板
https://blog.dov.moe/posts/37571/
作者
Dov
发布于
2022年6月11日
许可协议