本次主要通过Docker运行php-fpm 8.3,部署laravel项目,而web服务nginx运行在宿主机,mysql和redis,memcache也都运行在宿主机上。
废话不多说,直接上代码。
1、dockerfile
bash
# 第一阶段:构建阶段
FROM php:8.3-fpm-alpine AS builder
# 安装构建依赖
RUN apk add --no-cache \
autoconf \
g++ \
make \
libzip-dev \
postgresql-dev \
libmemcached-dev \
rabbitmq-c-dev \
hiredis-dev \
brotli-dev
# 安装 PHP 扩展
RUN docker-php-ext-install -j$(nproc) \
pdo_mysql \
pdo_pgsql
# 安装 PECL 扩展
RUN pecl install \
swoole \
amqp \
redis \
memcached \
&& docker-php-ext-enable \
amqp \
redis \
memcached
# 手动启用 swoole 扩展
RUN echo "extension=swoole.so" > /usr/local/etc/php/conf.d/swoole.ini
# 第二阶段:最终镜像
FROM php:8.3-fpm-alpine
# 从构建阶段复制已编译的扩展
COPY --from=builder /usr/local/lib/php/extensions/no-debug-non-zts-20230831/ /usr/local/lib/php/extensions/no-debug-non-zts-20230831/
COPY --from=builder /usr/local/etc/php/conf.d/ /usr/local/etc/php/conf.d/
# 安装运行时依赖
RUN apk add --no-cache \
libpq \
libzip \
libmemcached \
rabbitmq-c \
hiredis \
brotli
# 修改 php-fpm 配置文件,监听所有端口
RUN sed -i 's/listen = 127.0.0.1:9000/listen = 9000/g' /usr/local/etc/php-fpm.d/www.conf
# 设置工作目录
WORKDIR /var/www/html
# 设置目录权限
RUN chown -R www-data:www-data /var/www/html
# 暴露端口
EXPOSE 9000
# 启动 php-fpm
CMD ["php-fpm"]
这里额外添加了swoole,redis,amqp,memcahced扩展。
编译镜像:
bash
docker build -t php-fpm:8.3 .
耗时特别长,耐心等待完成。
部署laravel代码:
bash
docker run -itd --name=my-laravel -v /YOUR/LARAVEL/CODE/DIR:/var/www/html -p 9001:9000 php-fpm:8.3
用docker ps -a看下容器有没有成功运行。
如果没运行,使用docker logs my-laravel查看容器日志。
2、配置nginx
bash
server {
listen 80;
server_name www.you-web.com;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
charset utf-8;
location / {
root /var/www/laravel-example/public;
index index.php index.html;
try_files $uri $uri/ /index.php?$query_string;
}
#access_log /var/log/nginx/host.access.log main;
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# 这里是前端代码
location /adminui {
alias /var/www/laravel-admin-ui;
index index.html;
try_files $uri $uri/index.html /admin/index.html;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /var/www/html/public; # 这里要填容器中的目录位置
include fastcgi_params;
fastcgi_pass 172.34.296.51:9001; # 这里是宿主机的IP:Port
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.(?!well-know).* {
deny all;
}
}
到这里,php-fpm,nginx部署配置完成。mysql,redis,memcached的请自行安装这里就不讲了。
最后就是配置laravel,在.env文件中,各个服务的主机地址要填你服务所安装的机器的IP,并且要允许被远程访问。
到这里部署完成。
-完-