如何优雅地替换掉宝塔面板
本文最后更新于:2023年2月20日 中午
前言
近两年来宝塔面板一直毁誉参半,虽然他对于小白来说操作友好,但是糟糕的代码质量和层出不穷的 Bug 也让其备受质疑,而最近的两个月其更是爆出了隐私问题。
由此我下定决心将其换掉。由于我用宝塔无非就是为了 LNMP 环境(其实主要是 Nginx),而我的所有应用都是 Docker
化的,所以我决定用 Nginx Proxy Manager
(以下简称NPM
)来作为替代,同时也可以用PHP
和MariaDB
的 Docker
镜像来满足其他网站的环境需求。
搭建步骤
安装 Docker
和Docker 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.3
和7.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 验证)。
然后直接在页面上添加 Proxy Hosts 即可。
这样 Save 并做好域名解析之后就可以通过域名访问了。
下面主要讲一下非容器化的静态和动态网页。
静态网页
首先将网页所有内容都放在 ./data/static_websites/your_site
目录下,然后在线创建一个 Proxy Hosts。
Forward Hostname / IP
和 Forward 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 定时执行即可。
如果不需要本地备份文件,可以用我 修改过的脚本,只改了两行,其他一模一样。
本文建议与 如何优雅地使用 NPM 进阶篇 一起食用!
后记
宝塔面板有些小插件还是挺好用的,例如 Webhook
,Supervisor
。但是谁都不想自己的服务器时时刻刻接入网警吧。。。建议还是尽早替换成本文的全Docker
方案,迁移成本并不高,而且服务器干净,不会有任何风险。