对于 windows
的自动更新,加莫名其妙重启,内存占用太多离谱,实在是无力吐槽,决定换到 ubuntu 24.04
作为开发机器,以下内容为记录整个过程,后续也会更新使用相关内容。
常用软件
VSCode
Edge
Apifox
WPS
Rustdesk
Docker
Navicat
GIMP
Sublime Text
开发环境
多版本 php
:
这里使用 ppa:ondrej/php
来安装和管理 php
。
sudo add-apt-repository ppa:ondrej/php
sudo apt install php7.4 php8.1 php7.4-fpm php8.1-fpm
# 安装常用扩展
sudo apt install php7.4-mysql php7.4-mbstring php7.4-xml php7.4-gd php7.4-curl php7.4-intl php7.4-zip php7.4-bcmath php7.4-opcache php7.4-soap php7.4-redis php7.4-imagick
sudo apt install php8.1-mysql php8.1-mbstring php8.1-xml php8.1-gd php8.1-curl php8.1-intl php8.1-zip php8.1-bcmath php8.1-opcache php8.1-soap php8.1-redis php8.1-imagick
# 安装完扩展后重启
sudo systemctl restart php7.4-fpm
sudo systemctl restart php8.1-fpm
# 验证安装正常
sudo systemctl status php7.4-fpm
sudo systemctl status php8.1-fpm
他们的运行监听在 Unix
套接字位置:
PHP 7.4: /run/php/php7.4-fpm.sock
PHP 8.1: /run/php/php8.1-fpm.sock
默认安装位置:
/etc/php/7.4
/etc/php/8.1
使用命令切换默认版本:
sudo update-alternatives --config php
使用 ppa
安装的 php
会同时安装 apache2
,而计划使用 nginx
对接 php-fpm
所以不需要 apache2
,以下删除它:
# 查看安装了哪些包
# dpkg -l | grep -i apache2
sudo systemctl stop apache2
sudo systemctl disable apache2
sudo apt remove apache2 apache2-* libapache2-mod-php*
sudo apt autoremove
# 检查 php-fpm 正常
sudo systemctl status php7.4-fpm
sudo systemctl status php8.1-fpm
注意
因为后面要把套接字挂载到 nginx
容器中使用,需要保证 nginx
对挂载进来的 socket
文件有读写权限。
因为:
宿主机上的 /run/php/php7.4-fpm.sock 文件是由 PHP-FPM 进程创建的。它的所有者和所属组,以及权限模式,是由 PHP-FPM 池配置文件 (/etc/php/7.4/fpm/pool.d/www.conf 或类似文件) 中的 listen.owner, listen.group, 和 listen.mode 指令决定的。
通常,listen.owner 和 listen.group 会被设置为 www-data (或其他 Web 服务器用户),listen.mode 通常是 0660。这意味着只有 www-data 用户和 www-data 组的成员才有读写权限。
两种办法解决这个问题:
把 fpm
的监听用户改成 nginx
容器用户
使用以下命令获取 nginx
容器用户的 UID/GID
:
docker exec -it nginx id nginx
uid=101(nginx) gid=101(nginx) groups=101(nginx)
可以看到,都是 101
。
修改 /etc/php/7.4/fpm/pool.d/www.conf
来解决这个问题,把 listen.owner
和 listen.group
用户修改为 101
listen.owner = 101
listen.group = 101
listen.mode = 0660
保持listen.owner
和 listen.group
不变,放宽 listen.mode
权限限制
listen.mode = 0666
修改完记得重启 fpm
服务。
服务
这里主要是一些与开发是用到的服务相关的东西。
nginx + redis + mysql + mongo + rabbitmq
新建一个 env
文件夹,用来放一些相关配置。
env
目录机构
├── docker-compose.yaml
├── .env
├── mysql57
│ ├── log
│ └── my.cnf
├── nginx
│ ├── ca
│ ├── conf
│ │ ├── conf.d
│ │ │ └── default.conf
│ │ └── nginx.conf
│ └── logs
│ ├── access.log
│ └── error.log
└── redis
└── redis.conf
这里面的文件结合下面的 docker-compose.yaml
内容,非目录映射的配置文件,比如 my.cnf
,nginx.conf
,redis.conf
这些文件需要提前准备,可以 docker run
一个临时容器,从容器中把默认的配置文件复制出来。
.env
文件内容:
ENV_DIR=/data/docker-data/env
MYSQL_ROOT_PASSWORD=mysql密码
MYSQL_PORT=3306
NGINX_WWWROOT=/data/wwwroot
PHP_RUN_DIR=/run/php
REDIS_PORT=6379
RABBITMQ_PORT=5672
RABBITMQ_MANAGEMENT_PORT=15672
RABBITMQ_DEFAULT_USER=admin
RABBITMQ_DEFAULT_PASS=RABBITMQ密码
MONGO_PORT=27017
MONGO_ROOT_USER=admin
MONGO_ROOT_PASSWORD=mongo密码
docker-compose.yaml
文件内容:
networks:
env_network:
driver: bridge
volumes:
mysql_data:
redis_data:
rabbitmq_data:
mongo_data:
services:
mysql:
image: mysql:5.7
container_name: mysql57
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
ports:
- "${MYSQL_PORT:-3306}:3306"
healthcheck:
test: mysqladmin ping -h localhost -u root -p"${MYSQL_ROOT_PASSWORD}" --silent
interval: 30s
timeout: 10s
retries: 5
volumes:
- mysql_data:/var/lib/mysql
- ${ENV_DIR}/mysql57/my.cnf:/etc/mysql/my.cnf
- ${ENV_DIR}/mysql57/log:/var/log/mysql
restart: always
networks:
- env_network
nginx:
image: nginx:1.27
container_name: nginx
ports:
- "80:80"
volumes:
- ${ENV_DIR}/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ${ENV_DIR}/nginx/conf/conf.d:/etc/nginx/conf.d
- ${ENV_DIR}/nginx/logs:/var/log/nginx
- ${ENV_DIR}/nginx/ca:/etc/nginx/ca
- ${NGINX_WWWROOT}:/data/wwwroot
- ${PHP_RUN_DIR}:/run/php
healthcheck:
test: ["CMD-SHELL", "curl -so /dev/null http://localhost/ || exit 1"]
interval: 1m
timeout: 5s
retries: 3
extra_hosts:
- "host.docker.internal:host-gateway"
restart: always
networks:
- env_network
redis:
container_name: redis
image: library/redis:6.2-alpine
ports:
- "${REDIS_PORT:-6379}:6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
volumes:
- ${ENV_DIR}/redis/redis.conf:/etc/redis.conf
- redis_data:/data
command: redis-server /etc/redis.conf
restart: always
networks:
- env_network
rabbitmq:
image: rabbitmq:3.13.1-management
container_name: rabbitmq
ports:
- "${RABBITMQ_PORT:-5672}:5672"
- "${RABBITMQ_MANAGEMENT_PORT:-15672}:15672"
environment:
RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS}
volumes:
- rabbitmq_data:/var/lib/rabbitmq
healthcheck:
test: rabbitmq-diagnostics -q ping
interval: 30s
timeout: 10s
retries: 3
restart: always
networks:
- env_network
mongodb:
container_name: mongodb
image: mongo:4.4
ports:
- "${MONGO_PORT:-27017}:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_ROOT_USER}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_ROOT_PASSWORD}
volumes:
- mongo_data:/data/db
healthcheck:
test: ["CMD", "mongo", "--host", "localhost", "--username", "${MONGO_ROOT_USER}", "--password", "${MONGO_ROOT_PASSWORD}", "--authenticationDatabase", "admin", "--quiet", "--eval", "db.adminCommand('ping').ok"]
interval: 30s
timeout: 10s
retries: 5
start_period: 40s
restart: always
networks:
- env_network
特别注意:
因为 php-fpm
运行在宿主机,而 nginx
运行在 docker
中,宿主机上网站路径 /data/wwwroot
挂载到 nginx
的 docker
中需要保持路径一致。
权限上,需要保证 php-fpm
的监听的用户对于 php
所在目录的所有父级目录有执行权限,一般设置为 755
即可,表现为 drwxr-xr-x
,保证能穿过他们,同时,文件本身应该有读取权限。