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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 我之前在构建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 ...

参考资料

相关文章
|
23天前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
121 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
5月前
|
安全 Linux 编译器
探索Linux内核的奥秘:从零构建操作系统####
本文旨在通过深入浅出的方式,带领读者踏上一段从零开始构建简化版Linux操作系统的旅程。我们将避开复杂的技术细节,以通俗易懂的语言,逐步揭开Linux内核的神秘面纱,探讨其工作原理、核心组件及如何通过实践加深理解。这既是一次对操作系统原理的深刻洞察,也是一场激发创新思维与实践能力的冒险。 ####
|
2月前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
217 20
|
3月前
|
Prometheus 运维 监控
Prometheus+Grafana+NodeExporter:构建出色的Linux监控解决方案,让你的运维更轻松
本文介绍如何使用 Prometheus + Grafana + Node Exporter 搭建 Linux 主机监控系统。Prometheus 负责收集和存储指标数据,Grafana 用于可视化展示,Node Exporter 则采集主机的性能数据。通过 Docker 容器化部署,简化安装配置过程。完成安装后,配置 Prometheus 抓取节点数据,并在 Grafana 中添加数据源及导入仪表盘模板,实现对 Linux 主机的全面监控。整个过程简单易行,帮助运维人员轻松掌握系统状态。
448 3
|
4月前
|
关系型数据库 MySQL PHP
PHP与MySQL的无缝集成:构建动态网站的艺术####
本文将深入探讨PHP与MySQL如何携手合作,为开发者提供一套强大的工具集,以构建高效、动态且用户友好的网站。不同于传统的摘要概述,本文将以一个生动的案例引入,逐步揭示两者结合的魅力所在,最终展示如何通过简单几步实现数据驱动的Web应用开发。 ####
|
4月前
|
数据库连接 PHP 开发者
PHP中的异常处理:构建健壮的应用程序####
本文深入探讨了PHP中异常处理的重要性和实践方法,通过具体代码示例和最佳实践,展示了如何利用try-catch语句、自定义异常类以及全局异常处理器来提升应用程序的稳定性和可维护性。无论你是初学者还是有经验的开发者,本文都将为你提供有价值的见解和实用技巧,帮助你构建更加健壮的PHP应用程序。 ####
|
4月前
|
SQL 安全 前端开发
PHP与现代Web开发:构建高效的网络应用
【10月更文挑战第37天】在数字化时代,PHP作为一门强大的服务器端脚本语言,持续影响着Web开发的面貌。本文将深入探讨PHP在现代Web开发中的角色,包括其核心优势、面临的挑战以及如何利用PHP构建高效、安全的网络应用。通过具体代码示例和最佳实践的分享,旨在为开发者提供实用指南,帮助他们在不断变化的技术环境中保持竞争力。
|
4月前
|
PHP 开发者
深入浅出PHP:构建你的第一个Web应用
【10月更文挑战第35天】在数字时代的浪潮中,掌握编程技能已成为通往未来的钥匙。本文将带你从零开始,一步步走进PHP的世界,解锁创建动态网页的魔法。通过浅显易懂的语言和实际代码示例,我们将共同打造一个简单但功能强大的Web应用。无论你是编程新手还是希望扩展技能的老手,这篇文章都将是你的理想选择。让我们一起探索PHP的魅力,开启你的编程之旅!
|
4月前
|
人工智能 搜索推荐 PHP
PHP在Web开发中的璀璨星辰:构建动态网站的幕后英雄###
【10月更文挑战第25天】 本文将带您穿越至PHP的宇宙,揭示其作为Web开发常青树的奥秘。通过生动实例与深入解析,展现PHP如何以简便、高效、灵活的姿态,赋能开发者打造动态交互式网站,同时不忘探讨其在新时代技术浪潮中面临的挑战与机遇,激发对技术创新与应用的无限思考。 ###
57 1
|
4月前
|
关系型数据库 MySQL PHP
PHP与MySQL的深度整合:构建高效动态网站####
在当今这个数据驱动的时代,掌握如何高效地从数据库中检索和操作数据是至关重要的。本文将深入探讨PHP与MySQL的深度整合方法,揭示它们如何协同工作以优化数据处理流程,提升网站性能和用户体验。我们将通过实例分析、技巧分享和最佳实践指导,帮助你构建出既高效又可靠的动态网站。无论你是初学者还是有经验的开发者,都能从中获得宝贵的见解和实用的技能。 ####
53 0

热门文章

最新文章