前言

这是我第一次用 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 框架的后端也不存在什么启动后端服务的概念,直接这样把代码放在目录里就搞定了,直接访问即可。

参考资料

2023年的PHP项目部署笔记。什么?还有人用PHP?的更多相关文章

  1. Tomcat 初探(三)多项目部署

    起因 昨天房东找我说最近物价飞涨,要涨我房租,混不下去了,得要求老板涨工资.一大清早就去找老板,老板看了看我,让我发布先两个网站:一个前台网站 frontend,给用户用:一个后台管理网站 backe ...

  2. [Ting's笔记Day4]将Ruby on Rails项目部署到Heroku

    今天想笔记的是把自己写的Ruby on Rails项目部署(Deploy)到Heroku! Heroku是Salesforce公司旗下的云端服务商,支持多种程序语言像是Ruby,PHP,Python等 ...

  3. Thinkphp5笔记一:项目部署

    系统:window 7 64位 Thinkphp版本:5.0.5 环境:wampserver集成 笔记分为两大部分,配置篇与数据库篇 一.虚拟主机部署/本地部署 在网站根目录下建立文件index.ph ...

  4. ThinkPHP 学习笔记 ( 一 ) 项目部署:应用部署方式与模块分组部署方式

    /** * ThinkPHP version 3.1.3 */ ThinkPHP ( 官方网站:http://www.thinkphp.cn/ ) 目前最新版本是 3.2.2,它要求 PHP 的版本高 ...

  5. Linux学习笔记之Django项目部署(CentOS)----进阶篇

    一.引入 当我们开发好了一个Django项目之后是需要部署到服务器上的,这样才能正式使用这个项目.之前用了一个运行.sh文件的方法让项目得以在后台运行,其实随着学习的深入,这种方法其实是有点low的, ...

  6. 潭州课堂25班:Ph201805201 django 项目 第四十四课 项目部署 (课堂笔记)

    项目部署 稳定,并发,效益, 一.Django配置 1.settings.py配置 复制全局settings.py配置文件,创建一个副本命名为MyBlog/pro_settings.py,修改DEBU ...

  7. SpringBoot笔记--事件监听+启动流程+监控+项目部署

    事件监听 ApplicationContextInitializer SpringApplicationRunListener ApplicationRunner CommandLineRunner ...

  8. 项目总结笔记系列 wsTax KT Session1

     项目总结笔记 1.专有名词解释: SMO, Separate Management Office. UAT, User Accept Test. GSLB, Global Server Load B ...

  9. flask项目部署到阿里云 ubuntu16.04

    title: flask项目部署到阿里云 ubuntu16.04 date: 2018.3.6 项目地址: 我的博客 部署思路参考: Flask Web开发>的个人部署版本,包含学习笔记. 开始 ...

  10. Eclipse导入git上的maven web项目 部署 - lpshou

    http://www.tuicool.com/articles/fqm2Qf   推酷 文章 微博 主题 站点 活动 应用 周刊 登录   Eclipse导入git上的maven web项目 部署 - ...

随机推荐

  1. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-12-playwright操作iframe-中篇

    1.简介 按照计划今天就要用实际的例子进行iframe自动化测试.经过宏哥长时间的查找,终于找到了一个含有iframe的网页(QQ邮箱和163邮箱),别的邮箱宏哥就没有细看了.所以今天这一篇的主要内容 ...

  2. 轻松玩转70亿参数大模型!借助Walrus在AWS上部署Llama2

    Llama 2 是 Meta 的下一代开源大语言模型.它是一系列经过预训练和微调的模型,参数范围从 70 亿到 700 亿个.Meta Llama 2 可免费用于研究和商业用途并且提供了一系列具有不同 ...

  3. Mybatis-plus SQL效率插件PerformanceInterceptor无效->替换为p6spy

    使用mybatis-plus时,需要加入执行的sql分析 发现mybatis-plus中的PerformanceInterceptor无效了 查了信息发现 3.2.0 版本之后把这个功能可剔除了 可同 ...

  4. Jmeter插件PerfMon Metrics Collector安装使用及报错解决

    Jmeter作为一个轻量级的性能测试工具,开源.小巧.灵活的特性使其越来越受到测试人员喜爱.在实际的 项目中,特别是跨地区项目,排除合作方指定要求使用Loadrunner作为性能测试工具外,Jmete ...

  5. ios添加库文件

  6. Denpendcy Injection 8.0新功能——KeyedService

    Denpendcy Injection 8.0新功能--KeyedService 本文只介绍 .NET Denpendcy Injection 8.0新功能--KeyedService,假定读者已熟练 ...

  7. 使用 gopkg.in/yaml.v3 解析 YAML 数据

    YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式,常用于配置文件和数据交换.在 Go 语言中,你可以使用 gopkg.in/yaml.v3 包来解析和生成 ...

  8. Vue项目——尚品会

    1: 项目的初始化 环境要求:node + webpack + 淘宝镜像 初始化项目: vue create 项目名称 目录/文件分析: - node_modules文件夹:放置项目依赖的地方 - p ...

  9. 第六单元《管理学进展》单元测试 mooc

    第六单元<管理学进展>单元测试 返回 本次得分为:10.00/10.00, 本次测试的提交时间为:2020-08-30, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 判断( ...

  10. that of

    that of : 1. 代替签名的某个内容 The size of China is bigger than that of USA. (that of = the size of ) 2. 代指 ...