夕颜酱

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

记录一些自己瞎折腾的

  • 使用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
  • 世界,您好!

    欢迎使用 WordPress。这是您的第一篇文章。编辑或删除它,然后开始写作吧!