如何在webdevops/php-nginx的Docker容器中配置NGINX limit_req
调整Docker化Laravel应用的NGINX限流配置方案
1. 准备自定义限流配置文件
在项目根目录新建nginx-custom文件夹,创建limit-req.conf文件,写入NGINX限流规则(根据自身业务需求调整参数):
# 基于客户端IP定义限流区域,10M内存存储IP状态,每秒允许10次请求 limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s; # 将限流规则应用到Laravel API路径 location ~ ^/api/ { limit_req zone=api_limit burst=20 nodelay; }
rate=10r/s:每秒允许的基础请求数burst=20:允许的突发请求数nodelay:超过突发阈值的请求直接返回错误,不排队等待
如果需要对整个站点限流,可创建limit-req-global.conf:
limit_req_zone $binary_remote_addr zone=global_limit:10m rate=20r/s; server { limit_req zone=global_limit burst=30 nodelay; }
2. 修改Dockerfile.prod整合配置
在Dockerfile.prod中添加复制配置文件的命令,将自定义配置放入webdevops/php-nginx指定的目录:
- 针对应用级虚拟主机配置,添加到
vhost.common.d目录:
# 复制自定义限流配置到NGINX虚拟主机通用配置目录 COPY nginx-custom/limit-req.conf /opt/docker/etc/nginx/vhost.common.d/limit-req.conf
- 针对全局配置,添加到
conf.d目录:
COPY nginx-custom/limit-req-global.conf /opt/docker/etc/nginx/conf.d/limit-req-global.conf
修改后的完整Dockerfile.prod示例(在chown命令前添加复制配置的语句即可):
FROM webdevops/php-nginx:8.1-alpine ENV WEB_DOCUMENT_ROOT=/app/public ENV PHP_DISMOD=bz2,calendar,exiif,ffi,intl,gettext,ldap,imap,pdo_pgsql,pgsql,soap,sockets,sysvmsg,sysvsm,sysvshm,shmop,xsl,zip,gd,apcu,vips,yaml,imagick,mongodb,amqp WORKDIR /app COPY . . COPY composer.lock composer.lock COPY .env.prod .env RUN composer install --no-interaction --optimize-autoloader --no-dev RUN php artisan key:generate RUN php artisan config:cache RUN php artisan route:cache RUN php artisan view:cache # 新增:复制自定义NGINX限流配置 COPY nginx-custom/limit-req.conf /opt/docker/etc/nginx/vhost.common.d/limit-req.conf RUN chown -R application:application .
3. 重新构建镜像并部署
执行原有构建命令更新镜像:
docker build --file Dockerfile.prod -t ghcr.io/theotherdy/laravel-xmap-php-nginx:latest .
重启docker-compose服务使配置生效:
docker-compose down && docker-compose up -d
4. 验证配置是否生效
进入容器查看NGINX完整配置,确认限流规则已加载:
docker exec -it [你的应用容器ID/名称] nginx -T | grep limit_req
也可通过压测工具(如ab、wrk)模拟高并发请求,检查是否触发限流(通常返回429或503状态码)。
内容的提问来源于stack exchange,提问作者theotherdy
相关产品推荐
相关产品推荐

