如何在linux下手动构建PHP项目运行环境(lnmrp)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 我之前在构建PHP项目运行环境,直接采用宝塔或者PHPstduy等一键集成安装工具,虽然操作简单,运营维护起来也方便.但是总觉得不自己手动安装一次,总感觉少点啥一样;所以今天,我们进行一次手动安装PHP运行环境并部署项目运行.

前言

我之前在构建PHP项目运行环境,直接采用宝塔或者PHPstduy等一键集成安装工具,虽然操作简单,运营维护起来也方便.但是总觉得不自己手动安装一次,总感觉少点啥一样;

所以今天,我们进行一次手动安装PHP运行环境并部署项目运行.

要准备的工具

硬件 : 云服务器/虚拟机

操作系统 : Alibaba-Cloud-Linux-2.1903-LTS-64位/centos7

连接[云服务器/虚拟机]的远程工具 : xshell/MobaXterm_Personal等

nginx的安装

nginx介绍

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,Nginx是一款轻量级的Web 服务器/反向代理服 务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。

其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

反向代理

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。

同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。

反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。

负载均衡

负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上面,将原先请求到单个服务器上面的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,这就是所说的负载均衡。

动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低单个服务器的压力。

安装nginx前的准备

安装make

yum install -y gcc automake autoconf libtool make

安装g++

yum install -y gcc gcc-c++

安装其他扩展

一般我们都需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩。

安装pcre

下载最新的 PCRE 源码包,使用下面命令下载编译和安装 PCRE 包

# 进入opt文件夹
cd /opt
# 下载pcre-8.44.tar.gz
wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz
# 解压缩
tar -zxvf pcre-8.44.tar.gz
# 移动
mv pcre-1.2.11 /usr/local/nginx_extension/pcre
# 进入文件夹
cd /usr/local/nginx_extension/pcre
# 将pcre安装在/usr/local/nginx_extension/pcre
./confiure
# 进行编译安装
make && make install

安装zlib

下载最新的 zlib 源码包,使用下面命令下载编译和安装 zlib包:

# 进入opt文件夹
cd /opt
# 下载
wget http://zlib.net/zlib-1.2.11.tar.gz
# 解压缩zlib
tar -zxvf zlib-1.2.11.tar.gz
# 移动
mv zlib-1.2.11 /usr/local/nginx_extension/zlib
# 进入解压后的zlib文件夹
cd /usr/local/nginx_extension/zlib
# 将zlib安装在/usr/local/nginx_extension/zlib
./configure
# 进行编译安装
make && make install

安装openssl
cd /opt
wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz
tar -zxvf openssl-1.1.1g.tar.gz
mv openssl-1.1.1g /usr/local/nginx_extension/openssl

安装nginx

先到nginx官网
下载最新的nginx编译安装包,我这里下载的是nginx1.19.6

# 进入opt文件夹
cd /opt
# 下载
wget http://nginx.org/download/nginx-1.19.6.tar.gz
# 解压缩
tar -zxvf nginx-1.19.6.tar.gz
# 移动
mv nginx-1.19.6 /usr/local/nginx
# 进入解压好的
cd /usr/local/nginx
# 选择安装位置以及开放相应模块
./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_gzip_static_module --with-http_stub_status_module --with-file-aio --with-http_realip_module --with-http_ssl_module --with-pcre=/usr/local/nginx_extension/pcre --with-zlib=/usr/local/nginx_extension/zlib --with-openssl=/usr/local/nginx_extension/openssl
# 编译安装
make -j2 && mkae install

PHP安装

PHP介绍

PHP(“PHP: Hypertext Preprocessor”,超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML中,尤其适合 web 开发。

nginx如何运行PHP项目

nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。

nginx一般是把请求发fastcgi管理进程处理,fascgi管理进程选择cgi子进程处理结果并返回被nginx

PHP-FPM是一个PHP FastCGI管理器

PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。

新版PHP已经集成php-fpm了,不再是第三方的包了,推荐使用。

PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以被PHP官方收录了。

在./configure的时候带 –enable-fpm参数即可开启PHP-FPM,其它参数都是配置php的

PHP安装前的准备

基础运行环境安装

#以下已经安装了可以不用安装

yum -y install gcc automake autoconf libtool make

yum -y install gcc gcc-c++ glibc

# 可以直接安装,也可以在编译的时候再安装
yum -y install libmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel sqlite-devel sqlite

安装oniguruma

oniguruma是一个处理正则表达式的库,我们之所以需要安装它,是因为在安装php7.4的过程中,mbstring的正则表达式处理功能对这个包有依赖性,所以我们要先安装这个库

# 下载
wget https://github.com/kkos/oniguruma/archive/v6.9.4.tar.gz -O oniguruma-6.9.4.tar.gz
# 解压缩
tar -xvf oniguruma-6.9.4.tar.gz
# 移动
mv oniguruma-6.9.4 /usr/local/php_extension/niguruma
# 进入
cd /usr/local/php_extension/niguruma
# 编译
./autogen.sh
# 配置
./configure --prefix=/usr --libdir=/lib64
# 安装
make && make install

PHP安装

#进入opt文件夹
cd /opt
#下载
wget https://mirrors.sohu.com/php/php-7.4.16.tar.gz
# 解压
tar -zxvf php-7.4.16.tar.gz
# 进入PHP文件夹
cd php-7.4.16
# 配置安装
./configure --prefix=/usr/local/php  --enable-fpm --with-mysql --with-mysqli --with-pdo --with-pdo-mysql
# 安装
make all install

安装成功后,PHP的目录

配置到环境变量

vi /etc/profile
PHP_PATH=/usr/local/php
export PATH=$PATH:/$PHP_PATH/bin
source /etc/profile
php -v

安装完成之后,需要生成php-fpm配置文件

cd /usr/local/php
cp etc/php-fpm.conf.default etc/php-fpm.conf

cd /usr/local/php/etc/php-fpm.d
cp www.conf.default www.conf

PHP常用扩展的安装

将php安装包中的php.ini-production复制到/usr/local/php/lib

# 复制
cp /opt/php-7.4.16/php.ini-production /usr/local/php/lib
#重命名
rename /usr/local/php/lib/php.ini-production /usr/local/php/lib/php.ini
#验证是否已经加载到配置
php --ini
#查看当前php所使用的的module
php -m

编辑/usr/local/php/lib/php.ini,找到;extension_dir =把前面的分号去掉并更正现有的编译路径(/usr/local/php/lib/php/extensions/no-debug-non-zts-20190902/),找到;extension=模块名,选择要打开的模块,并把前面的分号去掉,我这里打开的模块

重启php-fpm之后,会有下图提示你,你打开的模块没有安装.这时就要回到php7.4的安装包中找到ext扩展包,根据下图提示进行安装php扩展

安装bz2扩展

cd /opt/php7.4.16/ext/bz2
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
php -m

其余的扩展同bz2扩展的安装步骤一直

安装关于mysql数据库的扩展时的操作注意

版本在PHP7朝上的,直接在编译安装是直接开放即可,无需做二次编译模块

mysql安装

下载mysql安装包,官网地址

首先查询是否有旧的mariadb安装包,有就卸载掉

rpm -qa | grep mariadb
rpm -e --nodeps mariadb-libs-5.5.68-1.1.al7.x86_64

安装新的mysql

cd /opt
wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz
tar -zxvf mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz /usr/local/mysql
groupadd mysql
useradd -r -g mysql mysql
chown -R mysql:mysql /usr/local/mysql

创建mysql的配置文件(my.cnf)

[client]
# 设置mysql客户端默认字符集
default-character-set = utf8mb4
#如果不设置会报错ERROR 2002 (HY000): Can't connect to local MySQL server through socket
socket=/usr/local/mysql/data/mysql.sock

[mysqld]
#设置3306端口
port=3306
character-set-server = utf8mb4

# 设置mysql的安装目录
basedir=/usr/local/mysql

# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock

# 禁用主机名解析
skip-name-resolve

# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
lower_case_table_names=1

# 过小可能会导致写入(导入)数据失败
max_allowed_packet = 256M
group_concat_max_len = 10240

# 允许最大连接数
max_connections=200

# 提到 join 的效率
join_buffer_size = 16M
# 事务日志大小
innodb_log_file_size = 256M
# 日志缓冲区大小
innodb_log_buffer_size = 4M
# 事务在内存中的缓冲
innodb_log_buffer_size = 3M

配置完成后

chown -R mysql:mysql /usr/local/mysql/data

bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

启动mysql

/usr/local/mysql/support-files/mysql.server start

将mysql添加到自启动中

cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
chkconfig --list mysqld

验证mysql是否加入到系统自启动中

登录mysql,修改root密码

# 建立一个链接文件。因为系统默认会查找/usr/bin下的命令。
ln -s /usr/local/mysql/bin/mysql /usr/bin
# 建立一个链接文件.因为系统默认会查找/tmp/mysql.sock(如果没有抛出这个错误ERROR2002(HY000),就无需设置)
ln -s /usr/local/mysql/data/mysql.sock /tmp/mysql.sock
mysql -uroot -p

Enter password:
#登录以后,修改用户密码
mysql> set password for root@localhost=password("用户新密码");
#设置root远程登录
mysql> GRANT ALL PRIVILEGES ON *.* TO'root'@'%' IDENTIFIED BY '用户密码' WITH GRANT OPTION;
Query OK, 0 rows affected, 1 warning (0.00 sec)
#更新权限
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

测试连接

到此mysql的就基本安装完成了.

php如何连接mysql

请回到PHP安装常用扩展中

redis安装

cd /opt
wget https://github.com/antirez/redis/archive/5.0.7.tar.gz 
tar -zxvf redis-5.0.7.tar.gz
mv redis-5.0.7 /usr/local/redis
cd /usr/local/redis
make && make PREFIX=/usr/local/redis install

redis远程连接

修改redis.conf文件

1.注释掉bind 127.0.0.1
2设置后台启动,将 daemonize no 改为 daemonize yes
3.protected-mode no #默认yes,开启保护模式,限制为本地访问

重启

bin/redis-server /usr/local/redis/redis.conf

php如何连接redis

下载redis扩展,官网地址

cd /opt
wget https://pecl.php.net/get/redis-5.3.7.tgz
tar -zxvf redis-5.3.7.tgz
mv redis-5.3.7 /usr/local/php_extension/redis
cd /usr/local/php_extension/redis
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

编译安装完成后,打开php.ini,添加上extension=redis,并重启php-fpm

PHP项目部署

1.创建一个单独的项目文件夹,上传或者使用git拉取项目代码,我这里使用的是上传项目

2.解压缩项目代码(如果是拉取,省略该步骤)

tar -zxvf 项目代码.tar.gz

3.创建数据库,并将数据表导入到该库中,建议是数据库管理工具(如:Navicat等)

4.在nginx中进行站点配置,打开nginx.conf配置,修改server中的信息

server {
        listen       80;
        server_name blog.lt996.cn;
        root /data/tblog/public;
        error_page   500 502 503 504  /50x.html;
        index index.php;
        charset utf-8;
        location / {
          # try_files $uri @laravels;
          try_files $uri $uri/ /index.php?$query_string;
        }
        location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }    
    }

重启nginx,并验证站点

至此,网站就部署好了

网站加速

原因

就是页面响应速度太慢了,提高页面加载速度

解决办法

1.添加swoole扩展,安装方式跟php的其他扩展安装方式一致,本次使用的swoole版本是4.4.12,安装完成后

2.下载hhxsv5/laravel-s扩展,我这采用的是composer,并添加,修改配置加速配置

composer require hhxsv5/laravel-s

具体修改的方法(http://www.phpxs.com/post/6623/)

3.修改nginx站点配置

upstream swoole {
    # 通过 IP:Port 连接
    server 127.0.0.1:5200 weight=5 max_fails=3 fail_timeout=30s;
    # 通过 UnixSocket Stream 连接,小诀窍:将socket文件放在/dev/shm目录下,可获得更好的性能
    #server unix:/yourpath/laravel-s-test/storage/laravels.sock weight=5 max_fails=3 fail_timeout=30s;
    #server 192.168.1.1:5200 weight=3 max_fails=3 fail_timeout=30s;
    #server 192.168.1.2:5200 backup;
    #keepalive 16;
}

server {
        listen       80;
        server_name blog.lt996.cn;
        root /data/tblog/public;
        error_page   500 502 503 504  /50x.html;
        index index.php;
        charset utf-8;
        location / {
          try_files $uri @laravels;
          #try_files $uri $uri/ /index.php?$query_string;
        }
        #location ~ \.php$ {
        #    fastcgi_pass 127.0.0.1:9000;
        #    fastcgi_index index.php;
        #    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #    include fastcgi_params;
        #}
        #location = /50x.html {
        #    root   html;
        #}
        location @laravels {
           proxy_connect_timeout 60s;
           proxy_send_timeout 60s;
           proxy_read_timeout 120s;
          proxy_http_version 1.1;
          proxy_set_header Connection "";
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Real-PORT $remote_port;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_set_header Scheme $scheme;
          proxy_set_header Server-Protocol $server_protocol;
          proxy_set_header Server-Name $server_name;
          proxy_set_header Server-Addr $server_addr;
          proxy_set_header Server-Port $server_port;
          # “swoole”是指upstream
          proxy_pass http://swoole;
      }
}

安装部署中的问题

出现could not find driver错误

1.查询项目配置是否的mysql是否连接成功

2.查询php.ini是否安装php_mysql模块,完成后请杀死之前php-fpm在启动

3.若安装了php_mysql模块,仍然出现该错误.请重新编译时,加上mysql的安装路径,编译完成后请杀死之前php-fpm在启动

./configure --prefix=/usr/local/php --with-pdo-mysql=/usr/local/mysql
make all install

ps -ef | grep php-fpm

kill -9 主进程ID 子进程ID ...

参考资料

相关文章
|
5月前
|
Web App开发 安全 PHP
刚上线的PHP项目被攻击了怎么办
近期因忙于多个项目,代码质量有所疏忽,导致项目上线后遭攻击。攻击者通过文件上传漏洞和测试登录方式入侵,修改了 index.php 并植入恶意文件。经排查,问题源于未限制上传文件类型及未关闭测试登录配置。修复措施包括锁定文件、限制上传后缀、关闭测试登录、删除高危用户并限制其访问。此次事件提醒我们,细节疏漏可能引发严重风险,需时刻保持警惕。
|
5月前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
7月前
|
JavaScript Linux PHP
composer如何安装以及举例在PHP项目中使用Composer安装TCPDF库-优雅草卓伊凡
composer如何安装以及举例在PHP项目中使用Composer安装TCPDF库-优雅草卓伊凡
223 3
composer如何安装以及举例在PHP项目中使用Composer安装TCPDF库-优雅草卓伊凡
|
11月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
598 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
7月前
|
存储 缓存 安全
php项目源码加密之Zend Guard Loader加密的代码解密可能性很小-优雅草卓伊凡
php项目源码加密之Zend Guard Loader加密的代码解密可能性很小-优雅草卓伊凡
320 2
|
7月前
|
PHP
Composer在PHP项目中的手动类自动加载策略
为了确保文件名和类名的一致性及其可预测性,类名通常应该与文件名相匹配,所有的类都应属于一个命名空间,并且目录结构应该反映命名空间的结构。如此一来,当新的类被创建时,它们会自动遵守已有的约定,从而无需修改自动加载逻辑,确保了代码的模块化和可管理性。
93 8
|
9月前
|
Java 关系型数据库 MySQL
在Linux平台上进行JDK、Tomcat、MySQL的安装并部署后端项目
现在,你可以通过访问http://Your_IP:Tomcat_Port/Your_Project访问你的项目了。如果一切顺利,你将看到那绚烂的胜利之光照耀在你的项目之上!
480 41
|
8月前
|
安全 API PHP
Composer在现代PHP项目中的进阶实践
简介:本文深入探讨PHP依赖管理工具Composer的核心功能与企业实践。首先介绍其如何通过`composer.json`实现声明式依赖管理,变革PHP生态;接着解析自动加载优化、版本策略(如`~`和`^`)及私有仓库集成等关键特性;然后分享CI/CD集成、多环境配置与性能优化技巧(如阿里云镜像加速)的企业级方案;最后提供常见问题排查方法,如内存不足和依赖冲突解决,助力开发者高效管理项目依赖。
194 3
|
10月前
|
关系型数据库 MySQL PHP
利用PhpStorm、phpstudy和xdebug快速构建PHP调试环境
至此,我们已经完成了PHP调试环境的构建。现在,你可以在PhpStorm中打开你的PHP项目,设置断点,然后开始调试你的代码了。希望这个指南能帮助你快速构建PHP调试环境,提高你的开发效率。
618 26
|
10月前
|
关系型数据库 MySQL Linux
查看Linux、Apache、MySQL、PHP版本的技巧
以上就是查看Linux、Apache、MySQL、PHP版本信息的方法。希望这些信息能帮助你更好地理解和使用你的LAMP技术栈。
507 17