目前很多站长建站的方案是通过 宝塔面板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.11.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.4PHP8.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.11.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 安装

  1. 访问 https://域名即可进入安装页面,如下,点击 现在就开始!
    wordpress安装页面

  2. 进入到此页面
    wordpress安装信息填写页面

  3. 填写相关信息点击 提交,这一步是要对数据库进行连接,注意信息填写准确,其中数据库主机为docker-compose文件中设置的ip地址,也可以为服务名:mysql或者容器名:mysql_local
    mysql数据库主机

    若出现问题,见解决方案
    wordpress安装信息填写完成页面

  4. 顺利的话,见到此界面,点击运行安装程序
    wordpress安装

  5. 安装之前,需要填写站点相关信息,这里设置了第一位用户的账户名和密码:wp_test_user/wp_test_password
    初始化站点信息

  6. 填写完站点信息以后,点击 安装WordPress
    安装WordPress

  7. 至此就安装成功啦,点击登录输入账户密码即可,wp_test_user/wp_test_password
    安装WordPress成功

  8. 点击登录
    WordPress登陆页面

  9. 进入WordPress后台
    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#
  1. 数据库容器可能还没有准备好,稍微等待一会儿,再重试
  2. 数据库错误,删除重新拉起
    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#
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。