我之前在构建PHP项目运行环境,直接采用宝塔或者PHPstduy等一键集成安装工具,虽然操作简单,运营维护起来也方便.但是总觉得不自己手动安装一次,总感觉少点啥一样;
所以今天,我们进行一次手动安装PHP运行环境并部署项目运行.
硬件 : 云服务器/虚拟机
操作系统 : Alibaba-Cloud-Linux-2.1903-LTS-64位/centos7
连接[云服务器/虚拟机]的远程工具 : xshell/MobaXterm_Personal等
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,Nginx是一款轻量级的Web 服务器/反向代理服 务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。
其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。
同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。
反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上面,将原先请求到单个服务器上面的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,这就是所说的负载均衡。
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低单个服务器的压力。
yum install -y gcc automake autoconf libtool make
yum install -y gcc gcc-c++
一般我们都需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩。
https://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

http://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

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官网(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: Hypertext Preprocessor”,超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML中,尤其适合 web 开发。
nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。
nginx一般是把请求发fastcgi管理进程处理,fascgi管理进程选择cgi子进程处理结果并返回被nginx
PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在 http://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的
#以下已经安装了可以不用安装
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是一个处理正则表达式的库,我们之所以需要安装它,是因为在安装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
#进入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.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扩展

cd /opt/php7.4.16/ext/bz2
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
php -m
其余的扩展同bz2扩展的安装步骤一直
版本在PHP7朝上的,直接在编译安装是直接开放即可,无需做二次编译模块
下载mysql安装包,官网地址(https://dev.mysql.com/downloads/mysql/5.7.html)

首先查询是否有旧的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安装常用扩展中
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.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

下载redis扩展,官网地址(https://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


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;
}
}
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 ...
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘