如何在linux下手动构建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

ftp.pcre.org/pub/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.net/zlib-1.2.11.tar.gz 下载最新的 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官网(http://nginx.org/en/download.html)下载最新的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的,可以在 php-fpm.org/download
下载得到.

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安装包,官网地址(dev.mysql.com/downloads/mysql/5.7....)

首先查询是否有旧的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扩展,官网地址(pecl.php.net/package/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

具体修改的方法(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 ...

参考资料

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 5

apt install nginx-full php-fpm mysql-server 不香吗?

1年前 评论
liuAT (楼主) 1年前
你看我吊吗啊

宝塔狗路过

1年前 评论
liuAT (楼主) 1年前
她来听我的演唱会 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!