2023年的PHP项目部署笔记。什么?还有人用PHP?
PHP?2023年还在用?Docker部署心累,不如直接装php-fpm和nginx省心。权限问题?chown一下搞定,composer安装依赖完美运行。
目录23 个章节
前言
这是我第一次用 PHP 的包管理工具 composer
一开始用 docker 进行部署,但一直出问题,最后还是选择直接在服务器上安装 php-fpm 搭配 nginx 的方案了。
PS:docker方式真的搞得心好累,现在回想起来还心有余悸😢
docker方案
先把我的 docker 方案放上来吧,毕竟也折腾了好久,处于基本可用的状态。
目录结构
目录结构如下
php-code
├─ log // 日志
│ ├─ nginx
│ └─ php
├─ conf // 配置
│ ├─ nginx
│ │ ├─ nginx.conf
│ │ └─ test.conf
│ └─ php
│ ├─ conf.d
│ │ └─ docker-php-ext-xdebug.ini
│ ├─ php-fpm.conf
│ └─ php.ini
├─ code // PHP代码
├─ docker-compose.yml
├─ Dockerfile
└─ .env
nginx配置
server {
listen 8080;
server_name localhost;
root /usr/share/nginx/html/public;
index index.php index.html index.htm;
charset utf-8;
client_max_body_size 100M;
location ~ \.php$ {
fastcgi_pass php-fpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/public$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
include fastcgi_params;
}
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?s=$1 last; break;
}
}
}
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
server_tokens off;
PHP配置
主要是开启调试日志,可以看到程序执行的时候有什么报错
docker-php-ext-xdebug.ini
xdebug.remote_enable = On
xdebug.remote_handler = dbgp
xdebug.remote_host = host.docker.internal
xdebug.remote_port = 9001
xdebug.remote_log = /var/log/php/xdebug.log
xdebug.idekey = PHPSTOR
php-fpm.conf
[global]
error_log = /proc/self/fd/2
; https://github.com/docker-library/php/pull/725#issuecomment-443540114
log_limit = 8192
[www]
; if we send this to /proc/self/fd/1, it never appears
access.log = /proc/self/fd/2
clear_env = no
; Ensure worker stdout and stderr are sent to the main error log.
catch_workers_output = yes
decorate_workers_output = no
php.ini
log_errors=On
dockerfile
构建docker镜像,这个项目要求的PHP版本是7.4
让我感到很奇怪的是 PHP 的官方镜像里居然没有 composer,还得自己折腾。
这个 dockerfile 参考了很多文章博客,结果发现还不如自己折腾一下,已知问题是 gd 插件安装没有生效,猜测是还需要使用 apt 安装
php-gd,然后docker-php-ext-install才能生效。
FROM composer:2.2 as composer
FROM php:7.4.33-fpm as php
# 镜像信息
LABEL Author="DealiAxy"
LABEL Version="2023.11"
LABEL Description="PHP 7-fpm 开发环境镜像."
# 更新为国内镜像
RUN apt install apt-transport-https ca-certificates \
&& mv /etc/apt/sources.list /etc/apt/sources.list.bak \
&& echo "Acquire::http::Pipeline-Depth \"0\";" > /etc/apt/apt.conf.d/99nopipelining \
&& echo 'deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free' > /etc/apt/sources.list \
&& echo 'deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free' >> /etc/apt/sources.list \
&& echo 'deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free' >> /etc/apt/sources.list \
&& apt-get update
# bcmath, calendar, exif, gettext, sockets, dba,
# mysqli, pcntl, pdo_mysql, shmop, sysvmsg, sysvsem, sysvshm 扩展
RUN docker-php-ext-install -j$(nproc) bcmath calendar exif gettext sockets dba mysqli pcntl pdo_mysql shmop sysvmsg sysvsem sysvshm iconv
RUN apt update && apt-get install -y git zip libpng-dev libzip-dev && \
rm -rf /var/lib/apt/lists/* && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
docker-php-ext-install pdo pdo_mysql mysqli gd zip bcmath opcache && \
docker-php-ext-enable mysqli gd
# 复制代码
COPY --chown=www-data:www-data ./code /var/www/html
# copy vender
COPY --from=composer /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ \
&& composer config -g --unset repos.packagist \
&& composer install \
&& ls -la
EXPOSE 9000
CMD ["php-fpm"]
环境变量 .env
APP_NAME=php-oa
docker-compose
version: "3.6"
services:
nginx:
image: nginx:stable-alpine
container_name: ${APP_NAME}_nginx
restart: unless-stopped
volumes:
- ./conf/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
- ./code:/usr/share/nginx/html
- ./log/nginx:/var/log/nginx
ports:
- "8080:8080"
depends_on:
- php-fpm
networks:
- default
- swag
php-fpm:
build: .
user: 'www-data:www-data'
container_name: ${APP_NAME}-php
restart: unless-stopped
volumes:
# - ./conf/php:/usr/local/etc/php
- ./code/public:/var/www/html/public
- ./conf/php/php-fpm.conf:/usr/local/etc/php-fpm.d/docker.conf
- ./conf/php/php.ini:/usr/local/etc/php/php.ini
- ./log/php:/var/log/php
networks:
- default
networks:
swag:
name: swag
external: true
default:
name: ${APP_NAME}
直接部署方案
这是最容易的方案
我的服务器是 Ubuntu 22.04 ,官方源的 PHP 是8.1版本,这里需要添加 PPA 才能使用 7.4 版本。
添加 PPA 源
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
安装PHP7.4
并且把常用扩展也安装了
sudo apt install php7.4 php7.4-fpm
sudo apt install php7.4-{cli,common,curl,zip,gd,mysql,xml,mbstring,json,intl}
装完查看状态
sudo systemctl status php7.4-fpm.service
安装和配置 nginx
安装就不多说了
直接配置
在 /etc/nginx/sites-available 里增加一个配置文件
这里的文件名是 php.conf
我们把 PHP 代码放在 /var/www/html/php-code
设置网站根目录为 PHP 代码下的 public 目录 (这是这个项目设计成这样的)
server {
server_name domain.com;
listen 8081;
root /var/www/html/php-code/public;
index index.php index.html index.htm;
charset utf-8;
client_max_body_size 100M;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php-fpm.sock;
}
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?s=$1 last; break;
}
}
}
安装 composer 和安装依赖
使用 composer 安装依赖
如果没有这一步的话,那就跟5、6年前在使用 PHP 的时候没有区别
官方地址
可以直接通过官方源安装,并且使用 php 直接执行安装脚本
sudo apt-get install curl
sudo apt-get install php php-curl
curl -sS https://getcomposer.org/installer -o composer-setup.php
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
sudo composer self-update
国内源
通过国内源下载二进制文件
curl https://mirrors.cloud.tencent.com/composer/composer.phar -o /usr/local/bin/composer
curl https://mirrors.aliyun.com/composer/composer.phar -o /usr/local/bin/composer
chmod +x /usr/local/bin/composer
检查 composer
composer -v
配置镜像
得先配置一下国内镜像,可以参考这个项目: https://github.com/china-speed/china-speed.github.io
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
composer config -g --unset repos.packagist
安装依赖
cd /var/www/html/php-code
composer install
搞定
处理权限问题
不知道是不是所有 PHP 项目都喜欢在项目下面创建和修改文件,这也给docker部署方式带来了不小的挑战
直接在系统上部署好一点,首先把代码目录所有者转移给 www-data 用户
chown -R www-data:www-data /var/www/html
为了本用户也能写入,添加一下用户组
usermod -a -G www-data {username}
对了,PHP文件还需要可执行权限才行……
chmod -R u+rwx /var/www/html/php-code
给组内的用户也添加一下读写权限
chmod -R g+rw /var/www/html/php-code
基本就搞定了。
使用 ThinkPHP 框架的后端也不存在什么启动后端服务的概念,直接这样把代码放在目录里就搞定了,直接访问即可。
参考资料
- https://linux.how2shout.com/how-to-install-php-7-4-on-ubuntu-22-04-lts-jammy-linux/
- https://www.myfreax.com/secure-nginx-with-let-s-encrypt-on-ubuntu-22-04/
- https://www.cherryservers.com/blog/how-to-install-composer-ubuntu
- https://www.myfreax.com/how-to-install-php-on-ubuntu-20-04/
- https://learnku.com/articles/31344
- https://github.com/mouyong/docker-php/tree/master/fpm
_EOF_
2023年的PHP项目部署笔记。什么?还有人用PHP?
- 本文作者:
- 程序设计实验室
- 版权声明:
- 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
相关文章
PHP7-0-新特性
变量类型 PHP7版本函数的参数和返回值增加了类型限定。 为什么PHP要加入类型呢?实际上此项特性是为了PHP7.1版本的JIT特性做准备,增加类型后PHP Jit可以准确判断变量类型,生成最佳的机器指令。 (针对密集运算的优化) 使用示例 function test(int $a, string $b, array $c) : int { //code } 错误异常 在过去,PHP程序出
2021-12-18 · PHP · 约 1 分钟
PHP-Ajax-跨域问题最佳解决方案
前言 Ajax跨域问题在开发中非常常见。 例如网页的域名是client.abc.com,而请求的域名是server.abc.com。 如果直接使用ajax访问,会有以下错误: XMLHttpRequest cannot load http://server.abc.com/server.php. No 'Access-Control-Allow-Origin' header is present
2021-12-18 · PHP · 约 1 分钟
PHP7-0-+-Swoole-环境配置
前言 Swoole是一个面向生产环境的 PHP 异步网络通信引擎。 使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。 使用 PHP + Swoole 作为网络通信框架,可以使企业 IT 研发团队的效率大大提升,
2021-12-18 · PHP · 约 1 分钟
SharpIco:用纯C#打造零依赖的.ico图标生成器,支持.NET9与AOT编译
SharpIco 是一款纯 C# 实现的跨平台图标生成工具,支持 AOT 编译,无需外部依赖。它能将 PNG 图片分解为多尺寸(16x16至512x512)合成 ICO 图标,并支持图标结构分析。工具提供命令行界面,可通过 dotnet tool 一键安装,并已发布至 NuGet 和 Scoop。项目旨在简化图标生成与验证,追求轻量、纯粹、易集成的使用体验。
2025-05-26 · C# · 约 1 分钟
讨论
共 0 条加载评论中…