如何在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 协议》,转载必须注明作者和本文链接
推荐文章: