前言

nuoyis-lnmp 作为从原nuoyis-lnmp-np和mariadb配合使用的容器转变为全编译构建融合的容器,并在此做出了巨大优化和独特的服务方面。此项目为开源项目,但没有上传配置文件,故在文章补足或后续添加。

开源地址: https://github.com/nuoyis/nuoyis-lnmp

改进方案如下:

  1. 构建时由原来shell脚本决定版本号融合到容器中变为整体,可以交付各个构建平台只需读取dockerfile
  2. 从nuoyis-lnmp-np开始,就已经将php引用转变为仅需include 即可切换最新版和兼容版。
  3. 从nuoyis-lnmp 0.0.2版本开始,逐步优化编写conf文件困难,不但每次启动自动写入一个nginx.conf.template, 头部需要ssl配置的均有内置include方案,仅需如下面编写

    server {
      include head.template;
      server_name nuoyis.net www.nuoyis.net;
      ssl_certificate /nuoyis-web/nginx/ssl/nuoyis.net.pem;
      ssl_certificate_key /nuoyis-web/nginx/ssl/nuoyis.net.key;
    
      root /nuoyis-web/nginx/webside/nuoyis-main;
      index index.php index.html;
    
      if ($scheme = http) {
        return 301 https://$host$request_uri;
      }
    
      if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php$1 last;
      }
      # PHP 最新版
      # include start-php-latest.conf;
      # PHP 兼容版
      include start-php-stable.conf;
    
      location ~ /\. {
          deny all;
          return 404;
      }
      access_log  /nuoyis-web/logs/nginx/blog.nuoyis.net.log;
      error_log  /nuoyis-web/logs/nginx/blog.nuoyis.net.error.log;
    }
  4. nuoyis-lnmp 在未检测到mariadb/init(自己创建的,对应目录目录下的/docker-entrypoint-initdb.d)/lockfiles下两个文件时,将会自动初始化并导入init 目录里所有的sql文件(建议首先创建个init.sql),init.sql参考

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
    CREATE USER 'nuoyis'@'%' IDENTIFIED BY 'password';
    GRANT ALL PRIVILEGES ON nuoyis.* TO 'nuoyis'@'%';
    #上面两行复制给你需要的账号,不会写丢给AI
    FLUSH PRIVILEGES;

    但是需要除init.sql外所有sql在首行引入以下内容

    CREATE DATABASE IF NOT EXISTS 数据库名;
    USE 数据库名;
  5. 抛弃arm32架构编译,因为在实际测试中,arm64启动数据库都有些吃力,arm32编译又多次报错就从0.0.2版本开始抛弃
  6. 支持nginx http3,nginx php latest采用lts版本openssl编译

使用方法(发布前已经在服务器上经过验证):

docker-compose 启动文件

services:
  nuoyis-lnmp:
    container_name: nuoyis-lnmp
    image: nuoyis1024/nuoyis-lnmp:latest
    networks: 
      nuoyis-net:
        aliases:
          - nuoyis-lnmp
    ports:
      - 80:80
      - 443:443
      - 443:443/udp
      - 3306:3306
    volumes:
      # nginx 配置文件
      - /nuoyis-server/web/nginx/conf:/nuoyis-web/nginx/conf
      # nginx 网站目录
      - /nuoyis-server/web/nginx/webside:/nuoyis-web/nginx/webside
      # nginx ssl
      - /nuoyis-server/web/nginx/ssl:/nuoyis-web/nginx/ssl
      # Log 目录
      - /var/log:/nuoyis-web/logs
      # mariadb 数据与配置
      - /nuoyis-server/web/mariadb/init:/docker-entrypoint-initdb.d
      # MariaDB 数据目录
      - /nuoyis-server/web/mariadb/server:/nuoyis-web/mariadb/data
      # MariaDB 导入目录(自动导入)
      - /nuoyis-server/web/mariadb/import:/nuoyis-web/mariadb/import
      # MariaDB 配置
      - /nuoyis-server/web/mariadb/config:/nuoyis-web/mariadb/config
    environment:
      TIME_ZONE: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: ""
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      retries: 3
      start_period: 10s
      timeout: 10s
    user: "${SUID}:${SGID}"
    restart: always

networks:
  nuoyis-lnmp-net:
    name: nuoyis-lnmp-net
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.223.0/24
          gateway: 192.168.223.1

kubernetes yaml启动文件

apiVersion: v1
kind: Namespace
metadata:
  name: nuoyis-lnmp
---
# ===================== Deployment: nuoyis-lnmp =====================
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nuoyis-lnmp
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nuoyis-lnmp
  template:
    metadata:
      labels:
        app: nuoyis-lnmp
    spec:
      nodeSelector:
        kubernetes.io/hostname: 你的node节点位置
      securityContext:
        runAsUser: 0
        runAsGroup: 0
      containers:
        - name: nuoyis-lnmp-np
          image: registry.cn-hangzhou.aliyuncs.com/nuoyis/nuoyis-lnmp:latest
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: ""
          ports:
            - name: http
              containerPort: 80
            - name: https
              containerPort: 443
            - name: mariadb
              containerPort: 3306
          volumeMounts:
            - name: nginx-conf
              mountPath: /nuoyis-web/nginx/conf
            - name: nginx-webside
              mountPath: /nuoyis-web/nginx/webside
            - name: nginx-ssl
              mountPath: /nuoyis-web/nginx/ssl
            - name: logs
              mountPath: /nuoyis-web/logs
            - name: mariadb-init
              mountPath: /docker-entrypoint-initdb.d
            - name: mariadb-data
              mountPath: /nuoyis-web/mariadb/data
            - name: mariadb-config
              mountPath: /nuoyis-web/config
            - name: shm
              mountPath: /dev/shm
          livenessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 10
            periodSeconds: 30
          readinessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 10
            periodSeconds: 30
      volumes:
        - name: nginx-conf
          hostPath:
            path: /nuoyis-server/web/nginx/conf
        - name: nginx-webside
          hostPath:
            path: /nuoyis-server/web/nginx/webside
        - name: nginx-ssl
          hostPath:
            path: /nuoyis-server/web/nginx/ssl
        - name: logs
          hostPath:
            path: /nuoyis-server/logs/nginx
        - name: mariadb-init
          hostPath:
            path: /nuoyis-server/web/mariadb/init
        - name: mariadb-data
          hostPath:
            path: /nuoyis-server/web/mariadb/server
        - name: mariadb-config
          hostPath:
            path: /nuoyis-server/web/mariadb/config
        - name: shm
          emptyDir:
            medium: Memory
            sizeLimit: 1Gi
---
apiVersion: v1
kind: Service
metadata:
  name: nuoyis-lnmp-svc
  namespace: default
spec:
  type: NodePort
  selector:
    app: nuoyis-lnmp
  ports:
    - name: http
      port: 80
      targetPort: 80
      nodePort: 80
      protocol: TCP
    - name: https-tcp
      port: 443
      targetPort: 443
      nodePort: 443
      protocol: TCP
    - name: https-udp
      port: 443
      targetPort: 443
      nodePort: 443
      protocol: UDP
    - name: mariadb
      port: 3306
      targetPort: 3306
      nodePort: 3306
      protocol: TCP

nginx http3 配置小提示

nginx http3 采用udp作为底层传输,目的就是减少握手次数,加快访问速度。但是只要有一点配置错误,基本上就无法使用http3。在上面,我已经将udp从软件方面写好放行了,腾讯云/阿里云等云厂商服务器则需要额外放行,还有你的系统防火墙

腾讯云/阿里云等云厂商服务器放行,就是去安全组添加个udp的443端口,如下图所示

image-20250821210833561

最后修改:2025 年 08 月 21 日
如果觉得我的文章对你有用,请随意赞赏