夕颜酱

为世界上最好次的伞伞而干杯!

使用docker搭建lnmp系统并且部署wordpress

第一次在国产云里搭建完成,故用一篇文章来记录搭建流程。

0、

sudo apt update && sudo apt upgrade -y

1、内存

设置Swap:

设置大小为2G 的Swap。若想设置其他数值,则将其中的2G 改为其他大小

#设置Swap

sudo fallocate -l 2G /swapfile        # 修改这里

sudo chmod 600 /swapfile

sudo mkswap /swapfile

sudo swapon /swapfile

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

echo 'vm.swappiness=30' | sudo tee -a /etc/sysctl.conf

echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf

取消设置Kdump:

关闭Kdump可以释放256M~384M不等的内存,但是会影响一些系统调试功能

#关闭Kdump

sudo vim /etc/default/grub
  • 在GRUB_CMDLINE_LINUX行找到 crashkernel= 内容,删除
crashkernel=0M-2G:0M,2G-8G:192M,8G-128G:256M,128G-:384M

不同系统版本,上述内容可能略有不同

sudo update-grub

sudo systemctl disable kdump-tools

sudo systemctl stop kdump-tools

#重启系统
sudo reboot

2、安装docker

安装:

sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common

sudo curl -fsSL http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository -y "deb [arch=$(dpkg --print-architecture)] http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

sudo apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

配置镜像源:

sudo vi /etc/docker/daemon.json

同时修改默认网关分配策略,以避免docker网络与服务器局域网的冲突

{
    "registry-mirrors": [
        "http://mirrors.cloud.aliyuncs.com",
        "https://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn"
],
    "default-address-pools": [
        {
            "base": "192.168.0.0/16",
            "size": 24
        }
    ]
}
sudo systemctl start docker

sudo systemctl restart docker

sudo systemctl enable docker

3、获取AccessKey:

  • 进入阿里云控制台
  • 鼠标悬停左上角 → 进入“访问控制 RAM”
  • 身份管理 → 用户 → 创建用户
  • 用户名随意,勾选AccessKey登录
  • 身份管理 → 用户,选择刚刚创建的用户

重要!!不能使用创建用户时自动获得的AccessKey!否则会直接验证失败!!

必须使用在以下步骤获取的AccessKey!!

  • 认证管理 → 创建AccessKey → 在阿里云ECS上运行的服务

必须选择这个选项!

  • 保存这一步所获取到的AccessKey ID与Secret
  • 权限管理 → 新增授权
  • 搜索并添加策略:AliyunDNSFullAccess

4、搭建LNMP容器并部署wordpress:

创建文件夹:

mkdir -p Docker/lnmp/{nginx/conf.d,nginx/ssl,mysql/data,php,wordpress,certbot}

cd Docker/lnmp

配置docker-compose.yml:

vi docker-compose.yml

务必!!注意修改其中的MySQL配置中的密码!!

否则会直接导致sql注入攻击!!

修改certbot配置中的example@qq.com为你自己的邮箱

services:
  # MySQL服务
  mysql:
    image: mysql:8.0
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root_password  # 务必!!修改为你的root密码
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: wp_password  # 务必!!修改为你的数据库用户密码
    volumes:
      - ./mysql/data:/var/lib/mysql
    networks:
      - lnmp
    restart: unless-stopped
    command: --default-authentication-plugin=mysql_native_password

  # PHP-FPM服务
  php:
    build: ./php
    container_name: php
    volumes:
      - ./wordpress:/var/www/html  # WordPress文件挂载到PHP容器
    networks:
      - lnmp
    depends_on:
      - mysql
    restart: unless-stopped

  # Nginx服务
  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d  # Nginx配置文件挂载
      - ./wordpress:/var/www/html         # 共享WordPress文件
      - ./nginx/ssl:/etc/nginx/ssl
    networks:
      - lnmp
    depends_on:
      - php
      - mysql

  # 使用官方certbot镜像以避免阿里云拉取问题
  certbot:
    image: certbot/certbot:latest
    volumes:
      - ./nginx/ssl:/etc/letsencrypt
    command: >
      sh -c "if [ ! -f /etc/letsencrypt/live/example.com/fullchain.pem ]; then
        pip install --timeout=60 --retries=10 -i https://mirrors.aliyun.com/pypi/simple certbot-dns-aliyun &&
        certbot certonly --non-interactive --agree-tos --email example@qq.com \
          --authenticator dns-aliyun \
          --dns-aliyun-credentials /etc/letsencrypt/aliyun.ini \
          --dns-aliyun-propagation-seconds 60 \
          -d '*.example.com' -d 'example.com';
      else
        certbot renew --quiet;
      fi"
    networks:
      - lnmp
    entrypoint: ""  # 覆盖默认entrypoint

networks:
  lnmp:
    driver: bridge

配置NGINX虚拟主机:

vi nginx/conf.d/wordpress.conf

同时配置https跳转、禁止IP访问

#配置https跳转
server {
    listen 80;
    server_name example.com *.example.com; # 替换为你的域名
    server_tokens off;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

#wordpress服务
server {
    listen 443 ssl http2;
    server_name example.com;
    root /var/www/html;
    index index.php;

    ssl_certificate /etc/nginx/ssl/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers on;

    # 性能优化
    http2_push_preload on;  # 启用服务器推送(需Nginx 1.13.9+)
    http2_max_requests 1000; # 单个连接最大请求数

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ /\.ht {
        deny all;
    }
}

# 默认禁止IP访问
server {
    listen 80 default_server;
    listen 443 ssl default_server;
    ssl_reject_handshake on;
    return 444;
}

配置php:

vi php/Dockerfile

必须注意:docker的应用镜像通常都是基于debian源,故使用官方的ubuntu源会出BUG

debian最新的apt源地址位于/etc/apt/sources.list.d/debian.sources

故使用老的/etc/apt/sources.list地址会出现“文件不存在”错误

FROM php:8.2-fpm

# 配置阿里云Debian镜像源(适配PHP官方镜像的Debian基础)
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources \
    && sed -i 's/security.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources

# 安装系统依赖
RUN apt-get update && apt-get install -y \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# 安装PHP扩展
RUN docker-php-ext-install mysqli pdo pdo_mysql \
    && docker-php-ext-enable mysqli pdo_mysql

配置aliyun.ini:

vi nginx/ssl/aliyun.ini

根据上述申请到的ACCESSKEY替换ACCESS_KEY和SECRET_KEY

务必注意格式!尤其是空格!只能出现在“=”的两侧!

dns_aliyun_access_key = ACCESS_KEY
dns_aliyun_access_key_secret = SECRET_KEY
chmod 600 nginx/ssl/aliyun.ini

获取ssl证书:

docker compose up -d --no-deps nginx php mysql

docker compose run --rm certbot

cd ~/Docker/lnmp/nginx/ssl

# 设置目录权限(755)
sudo find . -type d -exec chmod 755 {} \;

# 设置文件权限(644)
sudo find . -type f -exec chmod 644 {} \;

# 特殊处理私钥文件(600)
sudo chmod 600 live/example.com/privkey.pem archive/example.com/privkey*.pem

# 特殊处理aliyun.ini(600)
sudo chmod 600 aliyun.ini

# 设置文件归属
cd ..
sudo chown -R www-data:www-data ssl

设置ssl证书自动更新:

touch renew_cert.sh

chmod +x renew_cert.sh

touch certbot_renew.log

vi renew_cert.sh
#!/bin/bash
# 触发证书续期
docker compose run --rm certbot

# 重载Nginx配置(需等待证书更新完成)
sleep 5
docker compose exec nginx nginx -s reload

# 记录日志
echo "$(date) - Certificate renewal executed" >> /home/ecs-user/Docker/lnmp/certbot_renew.log
~                                                                                                      
(crontab -l 2>/dev/null; echo "0 3 1 1,3,5,7,9,11 * /bin/bash /home/ecs-user/Docker/lnmp/renew_cert.sh >> /home/ecs-user/Docker/lnmp/certbot_renew.log 2>&1") | sudo crontab -

启动容器:

docker compose up -d

5、安装wordpress:

wget https://wordpress.org/latest.tar.gz

tar -xzvf latest.tar.gz -C wordpress --strip-components=1

rm latest.tar.gz

sudo chmod -R 755 wordpress

chown -R www-data:www-data wordpress

配置wordpress:

  • 进入服务器安全组配置,添加入方向80443 端口
  • 使用浏览器访问服务器公网ip / 上述NGINX配置中指定的域名,进入wordpress安装页面

填写数据库信息:

  • 数据库名:wordpress
  • 用户名:wp_user

填写刚刚在配置中设置的数据库用户密码

  • 密码:

输入docker中定义的数据库主机名(mysql)

  • 数据库主机:mysql

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注