目前很多站长建站的方案是通过 宝塔面板
,1Panel面板
来搭建网站所需的LNMP/LAMP等服务器架构环境,进而架设自己的网站
然而虽然这些面板,使用和管理比较方便,对小白友好,但也在一定程度上吃掉了服务器的部分性能,同时,不能保证是否存在漏洞甚至后门,对于自己的数据,还是由自己完全掌控更好一些
本文采取的的方案是 docker搭建服务器LNMP环境,实现网站一键启动, 关闭, 备份和迁移,以WordPress为例
文章目录
1. Docker搭建 LNMP 环境
1.1 创建目录结构
先创建好所需的目录结构,若项目的根目录为 /root/myweb/
, 如下所示
主要子目录为 nginx/
, mysql/
, php/
, html/
主要文件为 docker-compose.yml
, nginx配置文件default.conf
, php配置文件php.ini
,这两个配置文件的内容在1.2.1
和1.2.2
节中
root@ser141892674557:~/myweb# tree -L 4
.
├── docker-compose.yml
├── html/
│ └── wordpress/
├── mysql/
│ ├── data/
│ └── logs/
├── nginx/
│ ├── conf/
│ │ └── conf.d/
│ │ └── default.conf
│ ├── logs/
│ └── ssl/
└── php/
└── php.ini
1.2 编写 docker-compose.yml 文件
创建好所需的目录以后,开始编写 docker-compose.yml
文件
本节先对各部分进行详细解释,帮助理解
高手也可直接跳转到本节最后部分自取: docker-compose.yml 完整配置
1.2.1 Nginx部分
一般nginx的镜像选择最新的即可
nginx: # 服务名称为 nginx,本服务会启动一个容器
image: nginx:latest # nginx最新官方镜像
container_name: nginx_local # 本服务的容器名称
restart: always # 本容器随docker启动自启动
environment: # 设置本容器的环境变量
- TZ=Asia/Shanghai # 本容器时区设置为国内时区
volumes: # 挂载卷命令,将容器数据本地化,容器停止数据不会消失
- ./nginx/conf/conf.d:/etc/nginx/conf.d # 映射nginx配置文件
- ./nginx/logs:/var/log/nginx # 日志文件挂载
- ./nginx/ssl:/etc/nginx/ssl # 网站证书文件挂载
- ./html/wordpress:/var/www/html # 静态资源根目录挂载,这里挂载的是wordpress网站代码目录
ports: # 配置宿主机端口和容器端口映射
- 80:80 # 宿主主机端口80 映射到 本容器端口80
- 443:443 # 宿主主机端口443 映射到 本容器端口443
depends_on: # 服务依赖关系,列出的服务会先于本服务启动
- php # php服务拉起后,本服务(nginx)才会启动
networks: # 本容器网络设置
wordpress_web: # 本容器加入的网络名称为 wordpress_web
ipv4_address: 172.25.0.2 # 本容器在wordpress_web网络中的ip地址
记得将 网站的证书和密钥 文件(这俩本质上就是个文本文件)拷贝到/root/myweb/nginx/ssl/
目录下,名字只要和下面的配置文件对应就行了
Nginx 的配置文件: /root/myweb/nginx/conf/conf.d/default.conf
server {
listen 443 ssl;
server_name 你的域名;
root /var/www/html;
index index.php;
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log error;
# Security headers
add_header X-Content-Type-Options nosniff always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate" always;
# Cookie security
proxy_cookie_flags ~ Secure HttpOnly;
# Hide sensitive information
fastcgi_hide_header X-Powered-By;
server_tokens off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:EECDH+AES256:!MD5;
ssl_prefer_server_ciphers on;
ssl_certificate /etc/nginx/ssl/fullchain.pem; # 网站证书文件,这里的路径不用改,是映射到容器里的路径
ssl_certificate_key /etc/nginx/ssl/key.pem; # 网站密钥文件,这里的路径不用改,是映射到容器里的路径
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# HTTP/3 support
add_header Alt-Svc 'h3=":443"; h3-29=":443"';
location / {
try_files uriuri/ /index.php?args;
}
# rewrite /wp-admin scheme://hosturi/ permanent;
location /wp-admin/ {
index index.php;
try_filesuri uri/ /index.php?args;
}
location ~ \.php{
fastcgi_pass php:9000;
fastcgi_index index.php;
# 设置脚本文件请求的路径
fastcgi_param SCRIPT_FILENAMEdocument_root$fastcgi_script_name;
# 引入fastcgi的配置文件
include fastcgi_params;
# 增大 FastCGI 缓冲区
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
# 增加超时时间
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 120s;
fastcgi_read_timeout 120s;
}
# Client upload settings
client_max_body_size 512M;
client_body_buffer_size 32k;
# Deny access to hidden files
location ~ /\. {
deny all;
}
}
1.2.2 PHP部分
php的镜像版本按需选择,选择网站软件包要求的版本,常用的版本有PHP7.4
,PHP8.1
等
由于使用php时往往需要这样那样的插件,而官方的PHP镜像都是不带插件的
所以我们往往需要以官网的镜像为基础,加上自己所需的插件,编译一个自定义的PHP镜像
我这里选了一个suyar/php integration系列的镜像,包含了大部分常用的插件,所以基本上可以直接使用,不需要再自己编译
php: # 服务名称为 php,本服务会启动一个容器
image: suyar/php:7.4-integration # php镜像版本
container_name: php_local # 本服务的容器名称
restart: always # 本容器随docker启动自启动
environment: # 设置本容器的环境变量
- TZ=Asia/Shanghai # 本容器时区设置为国内时区
volumes: # 挂载卷命令,将容器数据本地化,容器停止数据不会消失
- ./html/wordpress:/var/www/html # 静态资源根目录挂载,这里挂载的是wordpress网站代码目录
- ./php/php.ini:/usr/local/etc/php/php.ini # php相关配置挂载
expose: # 暴露端口设置
- "9000" # 本容器暴露的端口
depends_on: # 服务依赖关系,列出的服务会先于本服务启动
- mysql # mysql服务拉起后,本服务(php)才会启动
networks: # 本容器网络设置
wordpress_web: # 本容器加入的网络名称为 wordpress_web
ipv4_address: 172.25.0.3 # 本容器在wordpress_web网络中的ip地址
其中 PHP 的配置文件:/root/myweb/php/php.ini
upload_max_filesize = 100M
post_max_size = 100M
memory_limit = 2048M
max_execution_time = 180
1.2.3 Mysql部分
mysql的镜像我一般也是使用官方最新版本的
mysql: # 服务名称为 mysql,本服务会启动一个容器
image: mysql:latest # mysql镜像版本
container_name: mysql_local # 本服务的容器名称
environment: # 设置本容器的环境变量
- MYSQL_ROOT_PASSWORD=123456 # mysql数据库root用户密码,最好设置一个复杂的,123456只是示例
- TZ=Asia/Shanghai # 本容器时区设置为国内时区
- MYSQL_DATABASE=new_table # mysql里面新增的数据表名 new_table,可以自己起一个
volumes:
- ./mysql/log:/var/log/mysql # 映射日志目录,宿主机:容器
- ./mysql/data:/var/lib/mysql # 映射数据目录,宿主机:容器
expose: # 暴露端口设置
- "3306" # 本容器暴露的端口
restart: always # 本容器随docker启动自启动
networks: # 本容器网络设置
wordpress_web: # 本容器加入的网络名称为 wordpress_web
ipv4_address: 172.25.0.4 # 本容器在wordpress_web网络中的ip地址
1.2.4 docker-compose.yml 完整配置
本配置只是一个简单的基础配置,目的是搭建一个 搭建了一个 LNMP
服务器环境,对于建一个网站来说绰绰有余,写法很多,懂得可以自行修改
nginx配置文件default.conf
和php配置文件php.ini
的内容在1.2.1
和1.2.2
节中,
将 网站的证书和密钥 文件拷贝到/root/myweb/nginx/ssl/
目录下,名字只要和下面的配置文件对应就行了,它本质上就是个文本文件
version: '3.8' # 指定docker-compose 配置文件版本
networks: # 显式地定义网络
wordpress_web: # 网络名称为 wordpress_web
driver: bridge # 指定网络驱动类型为 桥接模式
ipam: # 指定网络的 IP 地址管理策略
config: # 定义IP地址管理的具体配置
- subnet: 172.25.0.0/24 # 定义了网络的子网范围
gateway: 172.25.0.1 # 指定该网络的默认网关地址
services: # 服务根节点
nginx: # 服务名称为 nginx,本服务会启动一个容器
image: nginx:latest # nginx最新官方镜像
container_name: nginx_local # 本服务的容器名称
restart: always # 本容器随docker启动自启动
environment: # 设置本容器的环境变量
- TZ=Asia/Shanghai # 本容器时区设置为国内时区
volumes: # 挂载卷命令,将容器数据本地化,容器停止数据不会消失
- ./nginx/conf/conf.d:/etc/nginx/conf.d # 映射nginx配置文件
- ./nginx/logs:/var/log/nginx # 日志文件挂载
- ./nginx/ssl:/etc/nginx/ssl # 网站证书文件挂载
- ./html/wordpress:/var/www/html # 静态资源根目录挂载,这里挂载的是wordpress网站代码目录
ports: # 配置宿主机端口和容器端口映射
- 80:80 # 宿主主机端口80 映射到 本容器端口80
- 443:443 # 宿主主机端口443 映射到 本容器端口443
depends_on: # 服务依赖关系,列出的服务会先于本服务启动
- php # php服务拉起后,本服务(nginx)才会启动
networks: # 本容器网络设置
wordpress_web: # 本容器加入的网络名称为 wordpress_web
ipv4_address: 172.25.0.2 # 本容器在wordpress_web网络中的ip地址
php: # 服务名称为 php,本服务会启动一个容器
image: suyar/php:7.4-integration # php镜像版本
container_name: php_local # 本服务的容器名称
restart: always # 本容器随docker启动自启动
environment: # 设置本容器的环境变量
- TZ=Asia/Shanghai # 本容器时区设置为国内时区
volumes: # 挂载卷命令,将容器数据本地化,容器停止数据不会消失
- ./html/wordpress:/var/www/html # 静态资源根目录挂载,这里挂载的是wordpress网站代码目录
- ./php/php.ini:/usr/local/etc/php/php.ini # php相关配置挂载
expose: # 暴露端口设置
- "9000" # 本容器暴露的端口
depends_on: # 服务依赖关系,列出的服务会先于本服务启动
- mysql # mysql服务拉起后,本服务(php)才会启动
networks: # 本容器网络设置
wordpress_web: # 本容器加入的网络名称为 wordpress_web
ipv4_address: 172.25.0.3 # 本容器在wordpress_web网络中的ip地址
mysql: # 服务名称为 mysql,本服务会启动一个容器
image: mysql:latest # mysql镜像版本
container_name: mysql_local # 本服务的容器名称
environment: # 设置本容器的环境变量
- MYSQL_ROOT_PASSWORD=123456 # mysql数据库root用户密码,最好设置一个复杂的,123456只是示例
- TZ=Asia/Shanghai # 本容器时区设置为国内时区
- MYSQL_DATABASE=new_table # mysql里面新增的数据表名 new_table,可以自己起一个
volumes:
- ./mysql/log:/var/log/mysql # 映射日志目录,宿主机:容器
- ./mysql/data:/var/lib/mysql # 映射数据目录,宿主机:容器
expose: # 暴露端口设置
- "3306" # 本容器暴露的端口
restart: always # 本容器随docker启动自启动
networks: # 本容器网络设置
wordpress_web: # 本容器加入的网络名称为 wordpress_web
ipv4_address: 172.25.0.4 # 本容器在wordpress_web网络中的ip地址
2. 启动网站
2.1 下载 WordPress 网站代码
WordPress有两个网站,国内网站推荐使用 国内版,点击表格中链接下载WordPress网站源码压缩包
国内版 | 国外版 | |
---|---|---|
官网地址 | https://cn.wordpress.org/ | https://wordpress.org/ |
下载地址 | https://cn.wordpress.org/latest-zh_CN.zip | https://wordpress.org/latest.zip |
2.2 上传压缩包并解压
将压缩包上传至目录 /root/myweb/html/
输入 unzip wordpress-6.7.1-zh_CN.zip
解压
解压得到 /root/myweb/html/wordpress/
root@ser141892674557:~/myweb/html# ll
total 34936
drwxrwxrwx 2 root root 4096 Jan 7 08:44 ./
drwxr-xr-x 6 root root 4096 Jan 7 07:13 ../
-rw-r--r-- 1 root root 35763559 Dec 11 03:05 wordpress-6.7.1-zh_CN.zip
root@ser141892674557:~/myweb/html# unzip wordpress-6.7.1-zh_CN.zip
total 34940
drwxrwxrwx 3 root root 4096 Jan 7 07:56 ./
drwxr-xr-x 6 root root 4096 Jan 7 07:13 ../
drwxr-xr-x 5 root root 4096 Nov 24 11:00 wordpress/
-rw-r--r-- 1 root root 35763559 Dec 11 03:05 wordpress-6.7.1-zh_CN.zip
这一步不要忘!更改目录权限,输入chmod 777 -R wordpress/
root@ser141892674557:~/myweb/html# chmod 777 -R wordpress/
root@ser141892674557:~/myweb/html# ll
total 34940
drwxrwxrwx 3 root root 4096 Jan 7 07:56 ./
drwxr-xr-x 6 root root 4096 Jan 7 07:13 ../
drwxrwxrwx 5 root root 4096 Nov 24 11:00 wordpress/
-rw-r--r-- 1 root root 35763559 Dec 11 03:05 wordpress-6.7.1-zh_CN.zip
root@ser141892674557:~/myweb/html#
2.3 一键启动
回到/root/myweb/
目录,运行 docker-compose up -d
root@ser141892674557:~/myweb# docker-compose up -d
Creating network "myweb_wordpress_web" with driver "bridge"
Creating mysql_local ... done
Creating php_local ... done
Creating nginx_local ... done
root@ser141892674557:~/myweb#
2.4 安装
- 访问
https://域名
即可进入安装页面,如下,点击现在就开始!
-
进入到此页面
-
填写相关信息点击
提交
,这一步是要对数据库进行连接,注意信息填写准确,其中数据库主机为docker-compose
文件中设置的ip地址,也可以为服务名:mysql
或者容器名:mysql_local
若出现问题,见解决方案
-
顺利的话,见到此界面,点击
运行安装程序
-
安装之前,需要填写站点相关信息,这里设置了第一位用户的账户名和密码:
wp_test_user
/wp_test_password
-
填写完站点信息以后,点击
安装WordPress
-
至此就安装成功啦,点击登录输入账户密码即可,
wp_test_user
/wp_test_password
-
点击登录
-
进入WordPress后台
3. 注意事项及常见错误
3.1 建立数据库连接时出错
有以下几种可能:
1. 代码目录没有更改权限,可能漏掉了 这一步, 补上,点击 重试
root@ser141892674557:~/myweb/html# chmod 777 -R wordpress/
root@ser141892674557:~/myweb/html# ll
total 34940
drwxrwxrwx 3 root root 4096 Jan 7 07:56 ./
drwxr-xr-x 6 root root 4096 Jan 7 07:13 ../
drwxrwxrwx 5 root root 4096 Nov 24 11:00 wordpress/
-rw-r--r-- 1 root root 35763559 Dec 11 03:05 wordpress-6.7.1-zh_CN.zip
root@ser141892674557:~/myweb/html#
- 数据库容器可能还没有准备好,稍微等待一会儿,再重试
- 数据库错误,删除重新拉起
docker-compose down
关闭容器
rm -rf mysql/data/*
删除数据库data
目录下的文件
docker-compose up -d
重新拉起容器,拉起后访问https://域名
, 重新安装
root@ser141892674557:~/myweb/mysql# docker-compose down
Stopping nginx_local ... done
Stopping php_local ... done
Stopping mysql_local ... done
Removing nginx_local ... done
Removing php_local ... done
Removing mysql_local ... done
Removing network myweb_wordpress_web
root@ser141892674557:~/myweb/mysql# ll
total 20
drwxr-xr-x 5 root root 4096 Dec 6 03:31 ./
drwxr-xr-x 6 root root 4096 Jan 7 09:31 ../
drwxr-xr-x 2 root root 4096 Dec 6 03:31 conf.d/
drwxrwxrwx 8 lxd root 4096 Jan 9 03:44 data/
drwxr-xr-x 2 root root 4096 Dec 6 03:31 log/
root@ser141892674557:~/myweb/mysql# rm -rf data/*
root@ser141892674557:~/myweb/mysql# docker-compose up -d
Creating network "myweb_wordpress_web" with driver "bridge"
Creating mysql_local ... done
Creating php_local ... done
Creating nginx_local ... done
root@ser141892674557:~/myweb/mysql#
评论(0)