mirror of
https://gitee.com/ShopeX/ECShopX
synced 2026-08-12 22:15:39 +08:00
4.3.0
This commit is contained in:
83
docker-dev/Dockerfile
Normal file
83
docker-dev/Dockerfile
Normal file
@@ -0,0 +1,83 @@
|
||||
FROM registry.cn-hangzhou.aliyuncs.com/shopex_company/ecshopex-php:ecx-7.4.32-fpm-alpine3.16
|
||||
|
||||
# 安装 MySQL、Redis、Nginx、Supervisor 和 Node.js
|
||||
# 基础镜像已包含 PHP 7.4.32 和 FPM,只需安装其他服务
|
||||
RUN apk add --no-cache \
|
||||
# MySQL (MariaDB)
|
||||
mariadb \
|
||||
mariadb-client \
|
||||
# Redis
|
||||
redis \
|
||||
# Nginx
|
||||
nginx \
|
||||
# Supervisor
|
||||
supervisor \
|
||||
# Node.js 16.x(从 Alpine 官方源安装)
|
||||
nodejs=16.20.2-r0 \
|
||||
npm \
|
||||
# 其他工具
|
||||
bash \
|
||||
curl \
|
||||
tzdata \
|
||||
ca-certificates \
|
||||
# Node.js 编译依赖
|
||||
python3 \
|
||||
make \
|
||||
g++ \
|
||||
&& rm -rf /var/cache/apk/* \
|
||||
&& npm config set registry https://registry.npmmirror.com \
|
||||
&& node --version && npm --version
|
||||
|
||||
# 设置时区
|
||||
ENV TZ=Asia/Shanghai
|
||||
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
||||
|
||||
# 创建必要的目录和用户
|
||||
RUN mkdir -p /var/log/supervisor \
|
||||
&& mkdir -p /etc/supervisor/conf.d \
|
||||
&& mkdir -p /var/lib/mysql \
|
||||
&& mkdir -p /var/run/mysqld \
|
||||
&& mkdir -p /var/lib/redis \
|
||||
&& mkdir -p /var/log/redis \
|
||||
&& mkdir -p /var/run/redis \
|
||||
&& mkdir -p /var/log/nginx \
|
||||
&& mkdir -p /var/log/php-fpm \
|
||||
&& mkdir -p /run/php \
|
||||
&& mkdir -p /var/lib/nginx/tmp/client_body \
|
||||
&& mkdir -p /var/lib/nginx/tmp/proxy \
|
||||
&& mkdir -p /var/lib/nginx/tmp/fastcgi \
|
||||
&& mkdir -p /var/lib/nginx/tmp/uwsgi \
|
||||
&& mkdir -p /var/lib/nginx/tmp/scgi \
|
||||
&& mkdir -p /data/httpd/ECShopX \
|
||||
&& mkdir -p /data/httpd/ECShopX_admin-frontend \
|
||||
&& mkdir -p /data/httpd/ECShopX_mobile-frontend \
|
||||
&& mkdir -p /data/httpd/ECShopX_desktop-frontend \
|
||||
&& (id -u redis >/dev/null 2>&1 || adduser -D -s /sbin/nologin redis) \
|
||||
&& (id -u www-data >/dev/null 2>&1 || (addgroup -g 82 www-data && adduser -D -s /sbin/nologin -u 82 -G www-data www-data)) \
|
||||
&& chown -R redis:redis /var/lib/redis /var/log/redis /var/run/redis \
|
||||
&& chown -R www-data:www-data /var/log/php-fpm /run/php /var/lib/nginx /var/log/nginx
|
||||
|
||||
# 只复制配置文件(项目代码通过 volumes 挂载)
|
||||
COPY docker-dev/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
||||
COPY docker-dev/docker-entrypoint.sh /usr/bin/entrypoint.sh
|
||||
COPY docker-dev/nginx.conf /etc/nginx/nginx.conf
|
||||
COPY docker-dev/php-fpm.conf /tmp/php-fpm-custom.conf
|
||||
COPY docker-dev/mysql.cnf /etc/my.cnf
|
||||
|
||||
# 创建 MySQL 配置链接
|
||||
RUN mkdir -p /etc/mysql && \
|
||||
(ln -sf /etc/my.cnf /etc/mysql/my.cnf 2>/dev/null || true)
|
||||
|
||||
# 设置权限
|
||||
RUN chmod +x /usr/bin/entrypoint.sh \
|
||||
&& chown -R mysql:mysql /var/lib/mysql \
|
||||
&& chown -R mysql:mysql /var/run/mysqld
|
||||
|
||||
# 工作目录
|
||||
WORKDIR /data/httpd
|
||||
|
||||
# 暴露端口
|
||||
EXPOSE 80 3306 6379
|
||||
|
||||
ENTRYPOINT ["/usr/bin/entrypoint.sh"]
|
||||
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf", "-n"]
|
||||
281
docker-dev/docker-entrypoint.sh
Executable file
281
docker-dev/docker-entrypoint.sh
Executable file
@@ -0,0 +1,281 @@
|
||||
#!/bin/sh
|
||||
# ECShopX API Docker 容器启动脚本
|
||||
# 负责初始化服务、配置环境和启动 Supervisor
|
||||
# 注意:某些非关键步骤允许失败(使用 || true),关键步骤失败会退出
|
||||
|
||||
# 设置时区
|
||||
if [ -z "$TZ" ]; then
|
||||
export TZ="Asia/Shanghai"
|
||||
fi
|
||||
if ! ln -snf /usr/share/zoneinfo/$TZ /etc/localtime || ! echo "$TZ" > /etc/timezone; then
|
||||
echo "警告: 无法设置时区,使用默认值"
|
||||
fi
|
||||
|
||||
# 配置 PHP-FPM(根据基础镜像的实际路径)
|
||||
PHP_FPM_CONF_DIR=""
|
||||
if [ -d "/usr/local/etc/php-fpm.d" ]; then
|
||||
PHP_FPM_CONF_DIR="/usr/local/etc/php-fpm.d"
|
||||
elif [ -d "/etc/php7/php-fpm.d" ]; then
|
||||
PHP_FPM_CONF_DIR="/etc/php7/php-fpm.d"
|
||||
elif [ -d "/etc/php-fpm.d" ]; then
|
||||
PHP_FPM_CONF_DIR="/etc/php-fpm.d"
|
||||
fi
|
||||
|
||||
if [ -n "$PHP_FPM_CONF_DIR" ] && [ -f "/tmp/php-fpm-custom.conf" ]; then
|
||||
if cp /tmp/php-fpm-custom.conf "$PHP_FPM_CONF_DIR/www.conf"; then
|
||||
echo "✓ PHP-FPM 配置已复制到: $PHP_FPM_CONF_DIR/www.conf"
|
||||
else
|
||||
echo "✗ 错误: 无法复制 PHP-FPM 配置文件"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 检测 PHP-FPM 可执行文件路径(用于 supervisor 配置)
|
||||
PHP_FPM_BIN=""
|
||||
if [ -f "/usr/local/sbin/php-fpm" ]; then
|
||||
PHP_FPM_BIN="/usr/local/sbin/php-fpm"
|
||||
elif [ -f "/usr/sbin/php-fpm7" ]; then
|
||||
PHP_FPM_BIN="/usr/sbin/php-fpm7"
|
||||
elif [ -f "/usr/sbin/php-fpm" ]; then
|
||||
PHP_FPM_BIN="/usr/sbin/php-fpm"
|
||||
elif command -v php-fpm &> /dev/null; then
|
||||
PHP_FPM_BIN=$(command -v php-fpm)
|
||||
fi
|
||||
|
||||
if [ -n "$PHP_FPM_BIN" ]; then
|
||||
# 更新 supervisor 配置中的 PHP-FPM 路径
|
||||
SUPERVISOR_CONF="/etc/supervisor/conf.d/supervisord.conf"
|
||||
if [ -f "$SUPERVISOR_CONF" ]; then
|
||||
# 使用 sed 更新配置(Alpine Linux 兼容语法)
|
||||
if sed -i "s|^command=.*php-fpm.*|command=$PHP_FPM_BIN -F|" "$SUPERVISOR_CONF"; then
|
||||
echo "✓ PHP-FPM 路径已设置为: $PHP_FPM_BIN -F"
|
||||
else
|
||||
echo "警告: 无法更新 supervisord.conf 中的 PHP-FPM 路径,使用默认配置"
|
||||
fi
|
||||
else
|
||||
echo "✗ 错误: $SUPERVISOR_CONF 文件不存在"
|
||||
echo "检查文件位置..."
|
||||
find /etc -name "supervisord.conf" 2>/dev/null || echo "未找到 supervisord.conf"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "警告: 未找到 PHP-FPM 可执行文件,supervisor 配置将使用默认路径"
|
||||
fi
|
||||
|
||||
# 设置环境变量默认值(使用更简洁的语法)
|
||||
export FPM_LISTEN="${FPM_LISTEN:-127.0.0.1:9000}"
|
||||
export FPM_PM="${FPM_PM:-dynamic}"
|
||||
export FPM_PM_MAX_CHILDREN="${FPM_PM_MAX_CHILDREN:-40}"
|
||||
export FPM_PM_MIN_SPARE_SERVERS="${FPM_PM_MIN_SPARE_SERVERS:-1}"
|
||||
export FPM_PM_MAX_SPARE_SERVERS="${FPM_PM_MAX_SPARE_SERVERS:-3}"
|
||||
export FPM_PHP_ADMIN_VALUE_MEMORY_LIMIT="${FPM_PHP_ADMIN_VALUE_MEMORY_LIMIT:-64M}"
|
||||
|
||||
export MYSQL_ROOT_PASSWORD="${MYSQL_ROOT_PASSWORD:-rootpassword}"
|
||||
export MYSQL_DATABASE="${MYSQL_DATABASE:-ecshopx}"
|
||||
export MYSQL_USER="${MYSQL_USER:-ecshopx}"
|
||||
export MYSQL_PASSWORD="${MYSQL_PASSWORD:-ecshopx}"
|
||||
|
||||
export REDIS_PASSWORD="${REDIS_PASSWORD:-redispassword}"
|
||||
|
||||
# 初始化 MySQL(如果数据目录为空或没有系统表)
|
||||
if [ ! -d "/var/lib/mysql/mysql" ] && [ ! -d "/var/lib/mysql/mariadb" ]; then
|
||||
echo "=========================================="
|
||||
echo "初始化 MySQL 数据目录..."
|
||||
echo "=========================================="
|
||||
|
||||
if ! mysql_install_db --user=mysql --datadir=/var/lib/mysql --skip-test-db --auth-root-authentication-method=normal >/dev/null 2>&1; then
|
||||
echo "✗ 错误: MySQL 数据目录初始化失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 启动 MySQL 以创建数据库和用户
|
||||
echo "启动临时 MySQL 进程..."
|
||||
mysqld_safe --defaults-file=/etc/my.cnf --user=mysql --datadir=/var/lib/mysql --skip-networking --socket=/var/run/mysqld/mysqld.sock >/dev/null 2>&1 &
|
||||
MYSQL_PID=$!
|
||||
|
||||
# 等待 MySQL 启动(最多等待 30 秒)
|
||||
echo "等待 MySQL 启动..."
|
||||
MYSQL_READY=false
|
||||
for i in $(seq 1 30); do
|
||||
if mysqladmin ping --socket=/var/run/mysqld/mysqld.sock --silent 2>/dev/null; then
|
||||
MYSQL_READY=true
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
if [ "$MYSQL_READY" = false ]; then
|
||||
echo "✗ 错误: MySQL 启动超时"
|
||||
kill $MYSQL_PID 2>/dev/null || true
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✓ MySQL 已启动,创建数据库和用户..."
|
||||
# 创建数据库和用户
|
||||
if ! mysql --socket=/var/run/mysqld/mysqld.sock -uroot <<EOF
|
||||
ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';
|
||||
CREATE DATABASE IF NOT EXISTS ${MYSQL_DATABASE};
|
||||
CREATE USER IF NOT EXISTS '${MYSQL_USER}'@'localhost' IDENTIFIED BY '${MYSQL_PASSWORD}';
|
||||
CREATE USER IF NOT EXISTS '${MYSQL_USER}'@'%' IDENTIFIED BY '${MYSQL_PASSWORD}';
|
||||
GRANT ALL PRIVILEGES ON ${MYSQL_DATABASE}.* TO '${MYSQL_USER}'@'localhost';
|
||||
GRANT ALL PRIVILEGES ON ${MYSQL_DATABASE}.* TO '${MYSQL_USER}'@'%';
|
||||
FLUSH PRIVILEGES;
|
||||
EOF
|
||||
then
|
||||
echo "✗ 错误: 无法创建数据库和用户"
|
||||
kill $MYSQL_PID 2>/dev/null || true
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 停止 MySQL(supervisor 会重新启动)
|
||||
echo "停止临时 MySQL 进程..."
|
||||
mysqladmin --socket=/var/run/mysqld/mysqld.sock -uroot -p${MYSQL_ROOT_PASSWORD} shutdown 2>/dev/null || kill $MYSQL_PID 2>/dev/null || true
|
||||
wait $MYSQL_PID 2>/dev/null || true
|
||||
sleep 2
|
||||
echo "✓ MySQL 初始化完成"
|
||||
fi
|
||||
|
||||
# 配置 Redis
|
||||
# 确保 Redis 用户和目录存在(Dockerfile 中已创建,这里只是确保)
|
||||
if ! id -u redis >/dev/null 2>&1; then
|
||||
echo "警告: Redis 用户不存在,尝试创建..."
|
||||
adduser -D -s /sbin/nologin redis || {
|
||||
echo "✗ 错误: 无法创建 Redis 用户"
|
||||
exit 1
|
||||
}
|
||||
fi
|
||||
mkdir -p /var/lib/redis /var/log/redis /var/run/redis
|
||||
chown -R redis:redis /var/lib/redis /var/log/redis /var/run/redis || {
|
||||
echo "✗ 错误: 无法设置 Redis 目录权限"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# 确保 Nginx 临时目录存在且有正确权限
|
||||
mkdir -p /var/lib/nginx/tmp/client_body \
|
||||
/var/lib/nginx/tmp/proxy \
|
||||
/var/lib/nginx/tmp/fastcgi \
|
||||
/var/lib/nginx/tmp/uwsgi \
|
||||
/var/lib/nginx/tmp/scgi \
|
||||
/var/log/nginx
|
||||
chown -R www-data:www-data /var/lib/nginx /var/log/nginx || {
|
||||
echo "警告: 无法设置 Nginx 目录权限,可能影响文件上传"
|
||||
}
|
||||
|
||||
# 配置 Redis 密码
|
||||
if [ -n "$REDIS_PASSWORD" ]; then
|
||||
# 检查 Redis 配置文件是否存在
|
||||
if [ -f "/etc/redis.conf" ]; then
|
||||
# 如果已有 requirepass 配置,替换它;否则添加
|
||||
if grep -q "^requirepass" /etc/redis.conf 2>/dev/null; then
|
||||
sed -i "s/^requirepass.*/requirepass ${REDIS_PASSWORD}/" /etc/redis.conf
|
||||
else
|
||||
echo "requirepass ${REDIS_PASSWORD}" >> /etc/redis.conf
|
||||
fi
|
||||
else
|
||||
# 如果配置文件不存在,创建基本配置
|
||||
cat > /etc/redis.conf <<EOF
|
||||
bind 0.0.0.0
|
||||
port 6379
|
||||
requirepass ${REDIS_PASSWORD}
|
||||
dir /var/lib/redis
|
||||
logfile /var/log/redis/redis.log
|
||||
daemonize no
|
||||
EOF
|
||||
fi
|
||||
fi
|
||||
|
||||
# 处理许可证文件
|
||||
if [ -n "$LICENSEZL" ]; then
|
||||
if echo "$LICENSEZL" | base64 -d > /data/httpd/ECShopX/license.zl 2>/dev/null; then
|
||||
echo "✓ 许可证文件已写入"
|
||||
else
|
||||
echo "警告: 许可证文件解码失败"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 如果提供了命令参数,直接执行(用于 docker exec 等场景)
|
||||
if [ -n "$1" ]; then
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
# 先启动 supervisord 在后台(临时修改配置为 daemon 模式)
|
||||
echo "=========================================="
|
||||
echo "启动 Supervisor 管理所有服务..."
|
||||
echo "=========================================="
|
||||
|
||||
# 创建临时配置文件(daemon 模式)
|
||||
TEMP_SUPERVISOR_CONF="/tmp/supervisord-daemon.conf"
|
||||
cp /etc/supervisor/conf.d/supervisord.conf "$TEMP_SUPERVISOR_CONF"
|
||||
# 修改为 daemon 模式
|
||||
sed -i 's/nodaemon=true/nodaemon=false/' "$TEMP_SUPERVISOR_CONF" 2>/dev/null || \
|
||||
sed -i 's/nodaemon = true/nodaemon = false/' "$TEMP_SUPERVISOR_CONF" 2>/dev/null || true
|
||||
|
||||
# 启动 supervisord 在后台
|
||||
echo "启动后台 supervisord..."
|
||||
if ! /usr/bin/supervisord -c "$TEMP_SUPERVISOR_CONF"; then
|
||||
echo "✗ 错误: 无法启动 supervisord"
|
||||
exit 1
|
||||
fi
|
||||
echo "✓ 后台 supervisord 已启动"
|
||||
|
||||
# 等待服务启动
|
||||
echo "等待服务启动..."
|
||||
sleep 5
|
||||
|
||||
# 检查 supervisord 是否运行(使用临时配置文件启动的进程)
|
||||
# 等待一下让 supervisord 完全启动
|
||||
sleep 2
|
||||
if ! supervisorctl -c "$TEMP_SUPERVISOR_CONF" status >/dev/null 2>&1; then
|
||||
echo "警告: 无法连接到后台 supervisord,尝试继续执行..."
|
||||
# 不退出,继续执行(composer 和迁移由 dev-setup.sh 处理)
|
||||
fi
|
||||
|
||||
# 等待 MySQL 和 Redis 就绪
|
||||
echo "等待 MySQL 和 Redis 服务就绪..."
|
||||
MYSQL_READY=false
|
||||
for i in $(seq 1 60); do
|
||||
if mysqladmin ping --socket=/var/run/mysqld/mysqld.sock --silent 2>/dev/null || \
|
||||
mysqladmin ping -h 127.0.0.1 -u root -p${MYSQL_ROOT_PASSWORD} --silent 2>/dev/null; then
|
||||
MYSQL_READY=true
|
||||
echo "✓ MySQL 已就绪"
|
||||
break
|
||||
fi
|
||||
if [ $((i % 5)) -eq 0 ]; then
|
||||
echo " 等待 MySQL... ($i/60)"
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
if [ "$MYSQL_READY" = false ]; then
|
||||
echo "警告: MySQL 启动超时,继续执行..."
|
||||
fi
|
||||
|
||||
REDIS_READY=false
|
||||
for i in $(seq 1 30); do
|
||||
if redis-cli -a ${REDIS_PASSWORD} ping 2>/dev/null | grep -q "PONG"; then
|
||||
REDIS_READY=true
|
||||
echo "✓ Redis 已就绪"
|
||||
break
|
||||
fi
|
||||
if [ $((i % 5)) -eq 0 ]; then
|
||||
echo " 等待 Redis... ($i/30)"
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
if [ "$REDIS_READY" = false ]; then
|
||||
echo "警告: Redis 启动超时,继续执行..."
|
||||
fi
|
||||
|
||||
# 注意:Composer 安装和数据库迁移已移到 dev-setup.sh 脚本中执行
|
||||
# 这样可以更好地控制执行时机和错误处理
|
||||
|
||||
# 停止后台 supervisord,然后在前台启动(成为 PID 1)
|
||||
echo "=========================================="
|
||||
echo "切换到前台模式运行 Supervisor..."
|
||||
echo "=========================================="
|
||||
supervisorctl -c "$TEMP_SUPERVISOR_CONF" shutdown 2>/dev/null || pkill supervisord 2>/dev/null || true
|
||||
sleep 2
|
||||
|
||||
# 使用原始配置文件在前台启动(成为 PID 1)
|
||||
exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf -n
|
||||
22
docker-dev/mysql.cnf
Normal file
22
docker-dev/mysql.cnf
Normal file
@@ -0,0 +1,22 @@
|
||||
[mysqld]
|
||||
user = mysql
|
||||
pid-file = /var/run/mysqld/mysqld.pid
|
||||
socket = /var/run/mysqld/mysqld.sock
|
||||
datadir = /var/lib/mysql
|
||||
bind-address = 0.0.0.0
|
||||
port = 3306
|
||||
character-set-server = utf8mb4
|
||||
collation-server = utf8mb4_unicode_ci
|
||||
default-storage-engine = innodb
|
||||
max_allowed_packet = 64M
|
||||
innodb_buffer_pool_size = 256M
|
||||
innodb_log_file_size = 64M
|
||||
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
|
||||
|
||||
[mysql]
|
||||
default-character-set = utf8mb4
|
||||
|
||||
[client]
|
||||
default-character-set = utf8mb4
|
||||
port = 3306
|
||||
socket = /var/run/mysqld/mysqld.sock
|
||||
197
docker-dev/nginx.conf
Normal file
197
docker-dev/nginx.conf
Normal file
@@ -0,0 +1,197 @@
|
||||
user www-data;
|
||||
worker_processes auto;
|
||||
error_log /var/log/nginx/error.log warn;
|
||||
pid /var/run/nginx.pid;
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||
'$status $body_bytes_sent "$http_referer" '
|
||||
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||
|
||||
access_log /var/log/nginx/access.log main;
|
||||
|
||||
sendfile on;
|
||||
tcp_nopush on;
|
||||
tcp_nodelay on;
|
||||
keepalive_timeout 65;
|
||||
types_hash_max_size 2048;
|
||||
client_max_body_size 50m;
|
||||
|
||||
# 配置临时目录路径(确保目录存在且有权限)
|
||||
client_body_temp_path /var/lib/nginx/tmp/client_body;
|
||||
proxy_temp_path /var/lib/nginx/tmp/proxy;
|
||||
fastcgi_temp_path /var/lib/nginx/tmp/fastcgi;
|
||||
uwsgi_temp_path /var/lib/nginx/tmp/uwsgi;
|
||||
scgi_temp_path /var/lib/nginx/tmp/scgi;
|
||||
|
||||
gzip on;
|
||||
gzip_vary on;
|
||||
gzip_proxied any;
|
||||
gzip_comp_level 6;
|
||||
gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;
|
||||
|
||||
# 前端服务(管理后台 + API 代理)
|
||||
server {
|
||||
listen 8080;
|
||||
server_name _;
|
||||
|
||||
# API 接口代理
|
||||
location /api/ {
|
||||
proxy_pass http://127.0.0.1:8090;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
client_max_body_size 32m;
|
||||
client_body_buffer_size 256k;
|
||||
}
|
||||
|
||||
# 图片资源代理(转发到 PHP 服务处理)
|
||||
location /storage/ {
|
||||
proxy_pass http://127.0.0.1:8090;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
client_max_body_size 32m;
|
||||
client_body_buffer_size 256k;
|
||||
}
|
||||
|
||||
# 微信授权代理
|
||||
location /wechatAuth/ {
|
||||
proxy_pass http://127.0.0.1:8090;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
client_max_body_size 32m;
|
||||
client_body_buffer_size 256k;
|
||||
}
|
||||
|
||||
# 管理后台静态资源
|
||||
location / {
|
||||
root /data/httpd/ECShopX_admin-frontend/dist/;
|
||||
index index.html index.htm;
|
||||
try_files $uri $uri/index.html $uri/ /index.html =404;
|
||||
}
|
||||
|
||||
# 安全配置
|
||||
location ~* \.(ini|sql|conf|bak)$ {
|
||||
return 404;
|
||||
}
|
||||
|
||||
location ~* ^/(themes|images|logs|data|demo|wap_themes)/.*\.(php|php5)$ {
|
||||
deny all;
|
||||
}
|
||||
|
||||
location ~ /\.(svn|git|)/ {
|
||||
deny all;
|
||||
}
|
||||
}
|
||||
|
||||
# PHP API 服务
|
||||
server {
|
||||
listen 8090;
|
||||
server_name _;
|
||||
index index.html index.htm index.php;
|
||||
root /data/httpd/ECShopX/public;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.php$is_args$args;
|
||||
}
|
||||
|
||||
location ~ \.php$ {
|
||||
add_header 'Access-Control-Allow-Origin' '*' always;
|
||||
add_header Access-Control-Allow-Headers "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With";
|
||||
add_header Access-Control-Expose-Headers "Authorization";
|
||||
add_header Access-Control-Allow-Methods "DELETE, GET, HEAD, POST, PUT, OPTIONS, TRACE, PATCH";
|
||||
|
||||
if ($request_method = OPTIONS ) {
|
||||
return 200;
|
||||
}
|
||||
|
||||
fastcgi_pass 127.0.0.1:9000;
|
||||
fastcgi_read_timeout 150;
|
||||
fastcgi_index index.php;
|
||||
fastcgi_buffers 4 128k;
|
||||
fastcgi_buffer_size 128k;
|
||||
fastcgi_busy_buffers_size 128k;
|
||||
fastcgi_temp_file_write_size 256k;
|
||||
fastcgi_temp_path /dev/shm;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
include fastcgi_params;
|
||||
}
|
||||
|
||||
location ~ /\.ht {
|
||||
deny all;
|
||||
}
|
||||
|
||||
location ~* \.(ini|sql|conf|bak)$ {
|
||||
return 404;
|
||||
}
|
||||
|
||||
location ~* ^/(themes|images|logs|data|demo|wap_themes)/.*\.(php|php5)$ {
|
||||
deny all;
|
||||
}
|
||||
|
||||
location ~ /\.(svn|git|)/ {
|
||||
deny all;
|
||||
}
|
||||
}
|
||||
|
||||
# H5前端服务(微信小程序H5版本)
|
||||
server {
|
||||
listen 8081;
|
||||
server_name _;
|
||||
|
||||
# 静态文件服务
|
||||
location / {
|
||||
root /data/httpd/eECShopX_mobile-frontend/dist/h5;
|
||||
index index.html index.htm;
|
||||
try_files $uri $uri/ /index.html =404;
|
||||
}
|
||||
|
||||
# 安全配置
|
||||
location ~* \.(ini|sql|conf|bak)$ {
|
||||
return 404;
|
||||
}
|
||||
|
||||
location ~ /\.(svn|git|)/ {
|
||||
deny all;
|
||||
}
|
||||
}
|
||||
|
||||
# PC前端服务代理(Nuxt)
|
||||
server {
|
||||
listen 8082;
|
||||
server_name _;
|
||||
|
||||
# 代理到Nuxt服务(监听3000端口)
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:3000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection 'upgrade';
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
proxy_read_timeout 300s;
|
||||
proxy_connect_timeout 75s;
|
||||
}
|
||||
|
||||
# 安全配置
|
||||
location ~* \.(ini|sql|conf|bak)$ {
|
||||
return 404;
|
||||
}
|
||||
|
||||
location ~ /\.(svn|git|)/ {
|
||||
deny all;
|
||||
}
|
||||
}
|
||||
}
|
||||
15
docker-dev/php-fpm.conf
Normal file
15
docker-dev/php-fpm.conf
Normal file
@@ -0,0 +1,15 @@
|
||||
[www]
|
||||
user = www-data
|
||||
group = www-data
|
||||
listen = 127.0.0.1:9000
|
||||
listen.owner = www-data
|
||||
listen.group = www-data
|
||||
pm = dynamic
|
||||
pm.max_children = 40
|
||||
pm.start_servers = 5
|
||||
pm.min_spare_servers = 5
|
||||
pm.max_spare_servers = 10
|
||||
pm.max_requests = 500
|
||||
php_admin_value[memory_limit] = 128M
|
||||
php_admin_value[upload_max_filesize] = 20M
|
||||
php_admin_value[post_max_size] = 20M
|
||||
81
docker-dev/supervisord.conf
Normal file
81
docker-dev/supervisord.conf
Normal file
@@ -0,0 +1,81 @@
|
||||
[unix_http_server]
|
||||
file=/run/supervisord.sock
|
||||
chmod=0700
|
||||
|
||||
[supervisord]
|
||||
logfile=/var/log/supervisord.log
|
||||
logfile_maxbytes=50MB
|
||||
logfile_backups=10
|
||||
loglevel=info
|
||||
pidfile=/run/supervisord.pid
|
||||
nodaemon=true
|
||||
minfds=1024
|
||||
minprocs=200
|
||||
|
||||
[rpcinterface:supervisor]
|
||||
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
|
||||
|
||||
[supervisorctl]
|
||||
serverurl=unix:///run/supervisord.sock
|
||||
|
||||
[program:mysql]
|
||||
command=/usr/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql --datadir=/var/lib/mysql --bind-address=0.0.0.0 --socket=/var/run/mysqld/mysqld.sock
|
||||
autostart=true
|
||||
autorestart=true
|
||||
startsecs=15
|
||||
startretries=5
|
||||
stdout_logfile=/var/log/supervisor/mysql.log
|
||||
stderr_logfile=/var/log/supervisor/mysql.log
|
||||
user=mysql
|
||||
priority=100
|
||||
environment=HOME="/var/lib/mysql"
|
||||
|
||||
[program:redis]
|
||||
command=/usr/bin/redis-server /etc/redis.conf --daemonize no
|
||||
autostart=true
|
||||
autorestart=true
|
||||
startsecs=5
|
||||
startretries=5
|
||||
stdout_logfile=/var/log/supervisor/redis.log
|
||||
stderr_logfile=/var/log/supervisor/redis.log
|
||||
user=redis
|
||||
priority=200
|
||||
directory=/var/lib/redis
|
||||
|
||||
[program:php-fpm]
|
||||
command=/usr/local/sbin/php-fpm -F
|
||||
autostart=true
|
||||
autorestart=true
|
||||
startsecs=3
|
||||
startretries=3
|
||||
stdout_logfile=/var/log/supervisor/php-fpm.log
|
||||
stderr_logfile=/var/log/supervisor/php-fpm.log
|
||||
user=root
|
||||
priority=300
|
||||
# entrypoint 脚本会检测 PHP-FPM 路径并更新此命令
|
||||
|
||||
[program:nginx]
|
||||
command=/usr/sbin/nginx -g "daemon off;"
|
||||
autostart=true
|
||||
autorestart=true
|
||||
startsecs=3
|
||||
startretries=3
|
||||
stdout_logfile=/var/log/supervisor/nginx.log
|
||||
stderr_logfile=/var/log/supervisor/nginx.log
|
||||
user=root
|
||||
priority=400
|
||||
|
||||
[program:nuxt]
|
||||
command=/bin/sh -c "sleep 5; cd /data/httpd/ECShopX_desktop-frontend && if [ -d .nuxt ] || [ -d .output ]; then if npm run 2>/dev/null | grep -q 'start'; then PORT=3000 HOST=0.0.0.0 npm run start; else PORT=3000 HOST=0.0.0.0 npm run dev; fi; else exit 0; fi"
|
||||
autostart=true
|
||||
autorestart=true
|
||||
startsecs=10
|
||||
startretries=3
|
||||
stdout_logfile=/var/log/supervisor/nuxt.log
|
||||
stderr_logfile=/var/log/supervisor/nuxt.log
|
||||
user=root
|
||||
priority=500
|
||||
directory=/data/httpd/ECShopX_desktop-frontend
|
||||
|
||||
[include]
|
||||
files = /etc/supervisor/conf.d/*.conf
|
||||
Reference in New Issue
Block a user