2023年的PHP项目部署笔记。什么?还有人用PHP?
前言
这是我第一次用 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
 
2023年的PHP项目部署笔记。什么?还有人用PHP?的更多相关文章
- Tomcat 初探(三)多项目部署
		
起因 昨天房东找我说最近物价飞涨,要涨我房租,混不下去了,得要求老板涨工资.一大清早就去找老板,老板看了看我,让我发布先两个网站:一个前台网站 frontend,给用户用:一个后台管理网站 backe ...
 - [Ting's笔记Day4]将Ruby on Rails项目部署到Heroku
		
今天想笔记的是把自己写的Ruby on Rails项目部署(Deploy)到Heroku! Heroku是Salesforce公司旗下的云端服务商,支持多种程序语言像是Ruby,PHP,Python等 ...
 - Thinkphp5笔记一:项目部署
		
系统:window 7 64位 Thinkphp版本:5.0.5 环境:wampserver集成 笔记分为两大部分,配置篇与数据库篇 一.虚拟主机部署/本地部署 在网站根目录下建立文件index.ph ...
 - ThinkPHP 学习笔记 ( 一 ) 项目部署:应用部署方式与模块分组部署方式
		
/** * ThinkPHP version 3.1.3 */ ThinkPHP ( 官方网站:http://www.thinkphp.cn/ ) 目前最新版本是 3.2.2,它要求 PHP 的版本高 ...
 - Linux学习笔记之Django项目部署(CentOS)----进阶篇
		
一.引入 当我们开发好了一个Django项目之后是需要部署到服务器上的,这样才能正式使用这个项目.之前用了一个运行.sh文件的方法让项目得以在后台运行,其实随着学习的深入,这种方法其实是有点low的, ...
 - 潭州课堂25班:Ph201805201 django 项目 第四十四课  项目部署 (课堂笔记)
		
项目部署 稳定,并发,效益, 一.Django配置 1.settings.py配置 复制全局settings.py配置文件,创建一个副本命名为MyBlog/pro_settings.py,修改DEBU ...
 - SpringBoot笔记--事件监听+启动流程+监控+项目部署
		
事件监听 ApplicationContextInitializer SpringApplicationRunListener ApplicationRunner CommandLineRunner ...
 - 项目总结笔记系列 wsTax KT Session1
		
项目总结笔记 1.专有名词解释: SMO, Separate Management Office. UAT, User Accept Test. GSLB, Global Server Load B ...
 - flask项目部署到阿里云 ubuntu16.04
		
title: flask项目部署到阿里云 ubuntu16.04 date: 2018.3.6 项目地址: 我的博客 部署思路参考: Flask Web开发>的个人部署版本,包含学习笔记. 开始 ...
 - Eclipse导入git上的maven web项目 部署 - lpshou
		
http://www.tuicool.com/articles/fqm2Qf 推酷 文章 微博 主题 站点 活动 应用 周刊 登录 Eclipse导入git上的maven web项目 部署 - ...
 
随机推荐
- 轻松玩转70亿参数大模型!借助Walrus在AWS上部署Llama2
			
Llama 2 是 Meta 的下一代开源大语言模型.它是一系列经过预训练和微调的模型,参数范围从 70 亿到 700 亿个.Meta Llama 2 可免费用于研究和商业用途并且提供了一系列具有不同 ...
 - 利用AI点亮副业变现:5个变现实操案例的启示
			
整体思维导图: 在这里先分享五个实操案例: 宝宝起名服务 AI科技热点号 头像壁纸号 小说推广号 流量营销号 你们好,我是小梦. 最初我计划撰写一篇关于AI盈利策略的文章,对AI目前的技术走向.应用场 ...
 - 【krpano】多分类缩略图及多分类地图案例
			
该案例提供了场景多分类缩略图展示以及多地图展示,效果如下截图: 下载地址:http://pan.baidu.com/s/1hsA5ta8 感谢群内小伙伴H·T·T的分享 ...
 - Jquery 将 JSON 列表的 某个属性值,添加到数组中,并判断一个值,在不在数据中
			
jquery 将 JSON 列表的 某个属性值,添加到数组中 如果你有一个JSON列表,并且想要将每个对象的某个属性值添加到数组中,你可以使用jQuery的$.each()函数来遍历JSON列表,并获 ...
 - Hadoop - WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...
			
Hadoop - WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... 配置完ha ...
 - std::for_each易忽略点
			
以下代码为修改vector内部的每一个元素,使其每个元素大小变为原来的平方. std::vector v1{1, 2, 4, 2}; std::for_each(begin(v1), end(v1), ...
 - Rethinking Point Cloud Registration as Masking and Reconstruction论文阅读
			
Rethinking Point Cloud Registration as Masking and Reconstruction 2023 ICCV *Guangyan Chen, Meiling ...
 - python3 gui  计时器
			
# -*- coding: utf-8 -*- # @Time : 2023/4/4 21:53 # @File : 定时器gui.py # @Software: PyCharm Community ...
 - gitlab ci 用 cypress/playwright 做测试并展示结果至 mr
			
前言 看了一下官方的教程好像都没有讲怎么将测试结果展示出来,只是给出测试的 ci 脚本,但根据 gitlab 官方的文档是有测试报告的展示的,所以这里给出一个基于 junit 测试报告的展示. 前期准 ...
 - CF1363C
			
题目简化和分析: 首先注意特判 $ x $ 在叶子节点上 ( 即度为 \(1\) ). 因为每人都采用最优策略所以不可能有人执着的为别人开路. 就是不在同一颗子树上挣扎,会从外围不断清理. 但是每步必 ...