第一次在国产云里搭建完成,故用一篇文章来记录搭建流程。
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:
- 进入服务器安全组配置,添加入方向 的 80 ,443 端口
- 使用浏览器访问服务器公网ip / 上述NGINX配置中指定的域名,进入wordpress安装页面
填写数据库信息:
- 数据库名:wordpress
- 用户名:wp_user
填写刚刚在配置中设置的数据库用户密码
- 密码:
输入docker中定义的数据库主机名(mysql)
- 数据库主机:mysql