以 ubuntu 24.04 作为开发机常用软件及基础服务

对于 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.ownerlisten.group 用户修改为 101

listen.owner = 101
listen.group = 101
listen.mode = 0660

保持listen.ownerlisten.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.cnfnginx.confredis.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 挂载到 nginxdocker 中需要保持路径一致。

权限上,需要保证 php-fpm 的监听的用户对于 php 所在目录的所有父级目录有执行权限,一般设置为 755 即可,表现为 drwxr-xr-x,保证能穿过他们,同时,文件本身应该有读取权限。

标题:以 ubuntu 24.04 作为开发机常用软件及基础服务

原文链接:https://beltxman.com/4530.html

若无特殊说明本站内容为 行星带 原创,未经同意请勿转载。

发表评论

您的电子邮箱地址不会被公开。

Scroll to top