docker下debian8编译安装nginx+php
'# docker下debian8编译安装nginx+php
一、背景与问题
在容器化部署场景中,使用Docker构建自定义镜像是一种常见需求。对于需要特定版本软件的项目,直接使用官方镜像可能无法满足需求。例如,在Debian 8系统中编译安装Nginx+PHP组合,通常需要处理以下问题:
- 软件依赖管理:需要处理libssl、pcre、zlib等依赖库的版本兼容性
- 编译配置:需要处理Nginx的模块化配置和PHP的扩展编译
- 环境隔离:需要确保容器内运行的进程与宿主机环境完全隔离
- 性能调优:需要配置合理的worker进程数和内存限制
- 安全风险:需要处理旧版软件可能存在的漏洞
本篇文章将深入探讨在Debian 8环境下通过Docker构建自定义Nginx+PHP镜像的完整流程,涵盖从Dockerfile编写到性能优化的各个方面。
二、基本原理
Docker通过容器技术实现应用隔离,其核心原理是基于Linux的cgroup和namespace机制。在Debian 8中编译安装Nginx+PHP涉及以下关键环节:
- 依赖管理:使用apt-get安装编译所需依赖库
- 源码编译:使用./configure生成Makefile
- 模块配置:通过--with参数指定Nginx模块
- PHP扩展:通过phpize生成扩展模块
- 服务配置:配置Nginx和PHP-FPM的配置文件
- 运行环境:设置环境变量和工作目录
三、环境准备
在开始编写Dockerfile之前,需要准备以下环境:
宿主机环境:
# 安装Docker sudo apt-get update sudo apt-get install docker.io基础镜像选择:
FROM debian:8开发工具安装:
RUN apt-get update && \ apt-get install -y build-essential libssl-dev libpcre3-dev zlib1g-dev
四、核心实现
1. 编译安装Nginx
# 安装Nginx依赖
RUN apt-get update && \
apt-get install -y libssl-dev libpcre3-dev zlib1g-dev
# 下载Nginx源码
RUN mkdir -p /usr/local/src/nginx && \
cd /usr/local/src/nginx && \
wget https://nginx.org/download/nginx-1.12.2.tar.gz && \
tar -zxvf nginx-1.12.2.tar.gz && \
rm nginx-1.12.2.tar.gz
# 编译Nginx
RUN cd /usr/local/src/nginx/nginx-1.12.2 && \
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module
# 编译安装
RUN make && make install关键代码解释:
./configure参数配置了必要的模块,包括SSL支持、HTTP/2支持等--prefix指定安装路径,确保后续配置文件正确引用- 编译安装后,Nginx二进制文件位于
/usr/local/nginx/sbin/nginx
2. 编译安装PHP
# 安装PHP依赖
RUN apt-get update && \
apt-get install -y php7.0-dev php7.0-fpm
# 下载PHP源码
RUN mkdir -p /usr/local/src/php && \
cd /usr/local/src/php && \
wget https://downloads.php.net/~hundredshark/php-7.0.33.tar.gz && \
tar -zxvf php-7.0.33.tar.gz && \
rm php-7.0.33.tar.gz
# 编译PHP
RUN cd /usr/local/src/php/php-7.0.33 && \
./configure --prefix=/usr/local/php \
--with-fpm \
--enable-opcache \
--enable-mbstring \
--enable-xml \
--enable-mysqlnd
# 编译安装
RUN make && make install关键代码解释:
--with-fpm启用FastCGI进程管理器--enable-opcache启用PHP性能优化模块- 编译安装后,PHP-FPM二进制文件位于
/usr/local/php/sbin/php-fpm
3. 配置Nginx与PHP-FPM
# 创建配置文件目录
RUN mkdir -p /etc/nginx /usr/local/nginx/conf /usr/local/nginx/logs
# 创建Nginx配置文件
RUN echo 'user nginx;' > /usr/local/nginx/conf/nginx.conf && \
echo 'worker_processes auto;' >> /usr/local/nginx/conf/nginx.conf && \
echo 'error_log /usr/local/nginx/logs/error.log;' >> /usr/local/nginx/conf/nginx.conf && \
echo 'events {' >> /usr/local/nginx/conf/nginx.conf && \
echo ' worker_connections 1024;' >> /usr/local/nginx/conf/nginx.conf && \
echo '}' >> /usr/local/nginx/conf/nginx.conf && \
echo 'http {' >> /usr/local/nginx/conf/nginx.conf && \
echo ' include /usr/local/nginx/conf/mime.types;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' default_type application/octet-stream;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' sendfile on;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' keepalive_timeout 65;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' gzip on;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' server {' >> /usr/local/nginx/conf/nginx.conf && \
echo ' listen 80;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' server_name localhost;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' location / {' >> /usr/local/nginx/conf/nginx.conf && \
echo ' root /usr/local/nginx/html;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' index index.html index.php;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' include fastcgi_params;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' fastcgi_pass unix:/var/run/php-fpm.sock;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' fastcgi_index index.php;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' include fastcgi_params;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' }' >> /usr/local/nginx/conf/nginx.conf && \
echo ' }' >> /usr/local/nginx/conf/nginx.conf && \
echo '}' >> /usr/local/nginx/conf/nginx.conf
# 创建PHP-FPM配置文件
RUN mkdir -p /etc/php-fpm.d /usr/local/php/etc
RUN echo '[global]' > /usr/local/php/etc/php-fpm.conf && \
echo 'pid = /usr/local/php/var/run/php-fpm.pid' >> /usr/local/php/etc/php-fpm.conf && \
echo '[www]' >> /usr/local/php/etc/php-fpm.conf && \
echo 'listen = /var/run/php-fpm.sock' >> /usr/local/php/etc/php-fpm.conf && \
echo 'listen.owner = nginx' >> /usr/local/php/etc/php-fpm.conf && \
echo 'listen.group = nginx' >> /usr/local/php/etc/php-fpm.conf && \
echo 'listen.mode = 0666' >> /usr/local/php/etc/php-fpm.conf && \
echo 'user = nginx' >> /usr/local/php/etc/php-fpm.conf && \
echo 'group = nginx' >> /usr/local/php/etc/php-fpm.conf && \
echo 'pm = dynamic' >> /usr/local/php/etc/php-fpm.conf && \
echo 'pm.max_children = 50' >> /usr/local/php/etc/php-fpm.conf && \
echo 'pm.start_servers = 5' >> /usr/local/php/etc/php-fpm.conf && \
echo 'pm.min_spare_servers = 5' >> /usr/local/php/etc/php-fpm.conf && \
echo 'pm.max_spare_servers = 30' >> /usr/local/php/etc/php-fpm.conf && \
echo 'slowlog = /usr/local/php/var/log/slow.log' >> /usr/local/php/etc/php-fpm.conf && \
echo 'request_terminate_timeout = 30s' >> /usr/local/php/etc/php-fpm.conf关键代码解释:
- 配置了Nginx的worker进程数和连接数
- 设置了FastCGI的参数,确保与PHP-FPM通信
- 配置了PHP-FPM的进程池参数,优化资源使用
五、完整案例
以下是一个完整的Dockerfile示例,包含完整的Nginx+PHP环境:
FROM debian:8
# 安装开发工具
RUN apt-get update && \
apt-get install -y build-essential libssl-dev libpcre3-dev zlib1g-dev php7.0-dev
# 创建工作目录
WORKDIR /usr/local/src
# 下载并编译Nginx
RUN mkdir -p /usr/local/nginx && \
cd /usr/local/src && \
wget https://nginx.org/download/nginx-1.12.2.tar.gz && \
tar -zxvf nginx-1.12.2.tar.gz && \
cd nginx-1.12.2 && \
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module && \
make && make install
# 下载并编译PHP
RUN mkdir -p /usr/local/php && \
cd /usr/local/src && \
wget https://downloads.php.net/~hundredshark/php-7.0.33.tar.gz && \
tar -zxvf php-7.0.33.tar.gz && \
cd php-7.0.33 && \
./configure --prefix=/usr/local/php \
--with-fpm \
--enable-opcache \
--enable-mbstring \
--enable-xml \
--enable-mysqlnd && \
make && make install
# 创建配置文件目录
RUN mkdir -p /etc/nginx /usr/local/nginx/conf /usr/local/nginx/logs /usr/local/php/etc /etc/php-fpm.d
# 创建Nginx配置文件
RUN echo 'user nginx;' > /usr/local/nginx/conf/nginx.conf && \
echo 'worker_processes auto;' >> /usr/local/nginx/conf/nginx.conf && \
echo 'error_log /usr/local/nginx/logs/error.log;' >> /usr/local/nginx/conf/nginx.conf && \
echo 'events {' >> /usr/local/nginx/conf/nginx.conf && \
echo ' worker_connections 1024;' >> /usr/local/nginx/conf/nginx.conf && \
echo '}' >> /usr/local/nginx/conf/nginx.conf && \
echo 'http {' >> /usr/local/nginx/conf/nginx.conf && \
echo ' include /usr/local/nginx/conf/mime.types;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' default_type application/octet-stream;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' sendfile on;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' keepalive_timeout 65;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' gzip on;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' server {' >> /usr/local/nginx/conf/nginx.conf && \
echo ' listen 80;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' server_name localhost;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' location / {' >> /usr/local/nginx/conf/nginx.conf && \
echo ' root /usr/local/nginx/html;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' index index.html index.php;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' include fastcgi_params;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' fastcgi_pass unix:/var/run/php-fpm.sock;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' fastcgi_index index.php;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' include fastcgi_params;' >> /usr/local/nginx/conf/nginx.conf && \
echo ' }' >> /usr/local/nginx/conf/nginx.conf && \
echo ' }' >> /usr/local/nginx/conf/nginx.conf && \
echo '}' >> /usr/local/nginx/conf/nginx.conf
# 创建PHP-FPM配置文件
RUN echo '[global]' > /usr/local/php/etc/php-fpm.conf && \
echo 'pid = /usr/local/php/var/run/php-fpm.pid' >> /usr/local/php/etc/php-fpm.conf && \
echo '[www]' >> /usr/local/php/etc/php-fpm.conf && \
echo 'listen = /var/run/php-fpm.sock' >> /usr/local/php/etc/php-fpm.conf && \
echo 'listen.owner = nginx' >> /usr/local/php/etc/php-fpm.conf && \
echo 'listen.group = nginx' >> /usr/local/php/etc/php-fpm.conf && \
echo 'listen.mode = 0666' >> /usr/local/php/etc/php-fpm.conf && \
echo 'user = nginx' >> /usr/local/php/etc/php-fpm.conf && \
echo 'group = nginx' >> /usr/local/php/etc/php-fpm.conf && \
echo 'pm = dynamic' >> /usr/local/php/etc/php-fpm.conf && \
echo 'pm.max_children = 50' >> /usr/local/php/etc/php-fpm.conf && \
echo 'pm.start_servers = 5' >> /usr/local/php/etc/php-fpm.conf && \
echo 'pm.min_spare_servers = 5' >> /usr/local/php/etc/php-fpm.conf && \
echo 'pm.max_spare_servers = 30' >> /usr/local/php/etc/php-fpm.conf && \
echo 'slowlog = /usr/local/php/var/log/slow.log' >> /usr/local/php/etc/php-fpm.conf && \
echo 'request_terminate_timeout = 30s' >> /usr/local/php/etc/php-fpm.conf
# 创建测试页面
RUN mkdir -p /usr/local/nginx/html && \
echo '<html><body><h1>Hello from Nginx+PHP</h1></body></html>' > /usr/local/nginx/html/index.html && \
echo '<?php phpinfo(); ?>' > /usr/local/nginx/html/info.php
# 设置环境变量
ENV PATH "/usr/local/nginx/sbin:$PATH"
ENV PATH "/usr/local/php/bin:$PATH"
ENV PHP_FPM_PID /usr/local/php/var/run/php-fpm.pid
# 暴露端口
EXPOSE 80
# 启动服务
CMD ["sh", "-c", "nginx & php-fpm && tail -f /usr/local/nginx/logs/error.log"]运行容器:
docker build -t nginx-php-debian8 .
docker run -d -p 80:80 --name my-nginx-php nginx-php-debian8验证:
访问 http://localhost/info.php 查看PHP信息
六、源码解析
1. 编译参数分析
Nginx的./configure参数:
--with-http_ssl_module:启用SSL支持--with-http_v2_module:启用HTTP/2协议--with-http_realip_module:获取客户端真实IP--with-http_gzip_static_module:启用静态文件压缩--with-http_stub_status_module:启用状态监控
PHP的./configure参数:
--with-fpm:启用FastCGI进程管理器--enable-opcache:启用OPcache缓存--enable-mbstring:启用多字节字符串处理--enable-xml:启用XML支持--enable-mysqlnd:启用MySQLnd模块
2. 配置文件分析
Nginx配置文件:
worker_processes auto:自动根据CPU核心数分配工作进程keepalive_timeout 65:设置保持连接超时时间gzip on:启用Gzip压缩fastcgi_pass:指定FastCGI后端地址
PHP-FPM配置文件:
pm.max_children:最大子进程数pm.start_servers:启动时的子进程数pm.min_spare_servers:最小空闲进程数pm.max_spare_servers:最大空闲进程数request_terminate_timeout:请求终止超时时间
七、进阶使用
1. 配置PHP扩展
# 编译安装MySQL扩展
RUN cd /usr/local/src && \
wget https://downloads.php.net/~hundredshark/php-7.0.33/ext/mysqlnd/mysqlnd-7.0.33.tar.gz && \
tar -zxvf mysqlnd-7.0.33.tar.gz && \
cd mysqlnd-7.0.33 && \
phpize && \
./configure --enable-mysqlnd && \
make && make install2. 配置日志监控
# 创建日志目录
RUN mkdir -p /usr/local/nginx/logs /usr/local/php/var/log
# 挂载日志目录
VOLUME ["/usr/local/nginx/logs", "/usr/local/php/var/log"]3. 配置安全策略
# 禁用不必要的模块
RUN sed -i 's/.*http_v2_module.*/--without-http_v2_module/' /usr/local/src/nginx-1.12.2/Configure八、性能与工程实践
1. 性能优化建议
调整worker进程数:
RUN echo 'worker_processes auto;' > /usr/local/nginx/conf/nginx.conf优化PHP-FPM配置:
RUN echo 'pm.max_children = 50' > /usr/local/php/etc/php-fpm.conf启用Gzip压缩:
RUN echo 'gzip on;' >> /usr/local/nginx/conf/nginx.conf
2. 安全风险分析
旧版本漏洞:
- Nginx 1.12.2存在已知漏洞,建议定期更新
- PHP 7.0.33已停止支持,需定期检查安全公告
配置文件安全:
- 禁用不必要的模块
- 设置严格的文件权限
- 启用安全头信息
3. 容器化最佳实践
最小化镜像:
FROM debian:8 RUN apt-get update && \ apt-get install -y build-essential使用多阶段构建:
FROM debian:8 as builder RUN apt-get update && \ apt-get install -y build-essential FROM debian:8 COPY --from=builder /usr/local/nginx /usr/local/nginx
九、常见问题与踩坑
1. 常见错误及解决方法
错误1:configure: error: C compiler cannot create executables
解决:
RUN apt-get install -y build-essential错误2:phpize: command not found
解决:
RUN apt-get install -y php7.0-dev错误3:Segmentation fault
解决:检查glibc版本是否兼容
2. 常见陷阱
陷阱1:未正确设置环境变量
ENV PATH "/usr/local/nginx/sbin:$PATH"陷阱2:未正确配置FastCGI参数
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;陷阱3:未设置正确的用户权限
RUN chown -R nginx:nginx /usr/local/nginx /usr/local/php十、最佳实践
- 版本管理:使用语义化版本号管理软件版本
- 依赖管理:使用conan或apt-cache pin管理依赖
- 配置管理:使用Ansible或Chef进行配置管理
- 安全加固:启用安全头信息,禁用不必要的模块
- 日志监控:使用ELK堆栈进行日志分析
- 性能监控:使用Prometheus+Grafana进行监控
十一、总结
在Debian 8环境下通过Docker构建自定义Nginx+PHP镜像,需要处理依赖管理、源码编译、配置文件设置等关键环节。通过合理配置worker进程数、PHP-FPM参数、启用Gzip压缩等手段,可以显著提升性能。同时,需要注意安全风险,定期更新软件版本,使用最小化镜像策略,避免潜在漏洞。
这种方案适用于需要高度定制化环境的项目,特别是需要特定PHP模块或旧版本软件的场景。但在生产环境中,建议使用更新的镜像版本,并定期进行安全审计和漏洞扫描。对于需要快速部署的项目,可以考虑使用官方镜像或更现代的Linux发行版。
评论已关闭