Centos7 LANMP环境搭建

PHP安装包TS和NTS的区别

phpinfo();

打印环境查看其中的 Thread Safety 项,这个项目就是查看是否是线程安全如果是:enabled,一般来说应该是ts版,否则是nts版。

PHP的TS和NTS版本

TS(Thread-Safety)即线程安全,多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。好处是不会出现数据不一致或者数据污染的情况,但耗费的时间要比 NTS 长。

PHP以 ISAPI 方式加载的时候选择TS版本。

TS:有php7apache2_4.dll文件

NTS(None-Thread Safe)即非线程安全,就是不提供数据访问保护,有可能出现多个线程先后或同时操作同一数据的情况,容易造成数据错乱(即脏数据),一般操作的执行时间要比 TS 短。

php以fast-cgi方式运行的时候选择NTS版本,具有更好的性能。

NTS:没有php7apache2_4.dll文件

TS和NTS版本的选择

php在windows下分为TS版和NTS版

Linux上的PHP同样有NTS和TS版本的区别,默认是NTS版本,configure时加上--enable-maintainer-zts则编译为TS版本

什么时候需要TS版本呢?

比如你要使用pthreads这个多线程的PECL扩展时,

或者PHP以MOD_PHP嵌入多线程运行下的Apache,

比如Apache在Linux上提供的Event MPM就是一个多进程多线程的工作模型,Windows上Apache采用的WinNT MPM也是一个多线程模型,这时都需要TS版本的PHP.

而如果以PHP-FPM(比如搭配Nginx或者Apache的mod_fastcgi)

或者PHP-CGI(比如搭配Apache的mod_fcgid或者Win上的IIS)来运行PHP,则一般都不需要TS线程安全版本的PHP.

以 FAST-CGI 或 PHP-FPM 方式运行就用NTS 非线程安全版

在windows系统下

Apache + PHP 组合,以 ISAPI 的方式运行。用 TS 线程安全版

若IIS,以isapi模式运行PHP使用TS版,以FastCGI模式运行PHP使用NTS版
  

在linux系统下

Apache + PHP,PHP一般作为Apache 的模块进行运行 选TS

Nginx + PHP ,(以php-fpm的方式运行)选NTS

PHP的运行模式

  1. CGI (通用网关接口/Common Gateway Interface)
它是一段程序,通俗的讲CGI就象是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执行程序,再把服务器执行程序的结果返还给HTML页。CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。

CGI方式在遇到连接请求(用户 请求)先要创建cgi的子进程,激活一个CGI进程,然后处理请求,处理完后结束这个子进程。这就是fork-and-execute模式。所以用cgi方式的服务器有多少连接请求就会有多少cgi子进程,子进程反复加载是cgi性能低下的主要原因。都会当用户请求数量非常多时,会大量挤占系统的资源如内 存,CPU时间等,造成效能低下。

  1. FAST CGI (常驻型CGI / Long-Live CGI)
fast-cgi 是cgi的升级版本,FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全称PHP FastCGI进程管理器进行管理。

补充:

FAST-CGI 是微软为了解决 CGI 解释器的不足而提出改进方案。当一个请求向 web server 发送请求时,web server总会fork一个CGI解释器进程进行处理这个请求,进程处理完成之后将结果返回给web server,web server将结果返回并显示出来,进程结束,当用户再次请求同一个页面时,web server又会fork一个新进程进行请求处理,这样效率会比较低下(CGI被人诟病的主要原因)。而采用FAST-CGI 解释器的 话,当一个请求执行完毕后不会注销该进程,而是将改进程进入休眠期,当接收到新的请求时,重新启用改进程进行处理。FAST-CGI 较CGI 减少了进程的重复创建的资源占用。

  1. CLI(命令行运行 / Command Line Interface)
PHP-CLI是PHP Command Line Interface的简称,如同它名字的意思,就是PHP在命令行运行的接口,区别于在Web服务器上运行的PHP环境(PHP-CGI,ISAPI等)。

也就是说,PHP不单可以写前台网页,它还可以用来写后台的程序。 PHP的CLI Shell脚本适用于所有的PHP优势,使创建要么支持脚本或系统甚至与GUI应用程序的服务端,在Windows和Linux下都是支持PHP-CLI模式的。

  1. 模块模式
模块模式是以mod_php5模块的形式集成,此时mod_php5模块的作用是接收Apache传递过来的PHP文件请求,并处理这些请求,然后将处理后的结果返回给Apache。如果我们在Apache启动前在其配置文件中配置好了PHP模块(mod_php5), PHP模块通过注册apache2的ap_hook_post_config挂钩,在Apache启动的时候启动此模块以接受PHP文件的请求。

除了这种启动时的加载方式,Apache的模块可以在运行的时候动态装载,这意味着对服务器可以进行功能扩展而不需要重新对源代码进行编译,甚至根本不需要停止服务器。我们所需要做的仅仅是给服务器发送信号HUP或者AP_SIG_GRACEFUL通知服务器重新载入模块。但是在动态加载之前,我们需要将模块编译成为动态链接库。此时的动态加载就是加载动态链接库。 Apache中对动态链接库的处理是通过模块mod_so来完成的,因此mod_so模块不能被动态加载,它只能被静态编译进Apache的核心。这意味着它是随着Apache一起启动的。

  1. ISAPI(Internet Server Application Programming Interface)
通常是指被http服务器所加载,以服务器的模块形式运行,由微软提出,故只能在win平台上运行,

例如win下的apache,iis

ISAPI(Internet Server Application Program Interface)是微软提供的一套面向Internet服务的API接口,一个ISAPI的DLL,可以在被用户请求激活后长驻内存,等待用户的另一个请求,还可以在一个DLL里设置多个用户请求处理函数,此外,ISAPI的DLL应用程序和WWW服务器处于同一个进程中,效率要显著高于CGI。(由于微软的排他性,只能运行于windows环境)

PHP作为Apache模块,Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦有请求出现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。这些服务器副本在处理完一次HTTP请求之后并不立即退出,而是停留在计算机中等待下次请求。对于客户浏览器的请求反应更快,性能较高。

备注:在PHP5.3以后,PHP不再有ISAPI模式,安装后也不再有php5isapi.dll这个文件。要在IIS6上使用高版本PHP,必须安装FastCGI 扩展,然后使IIS6支持FastCGI。


PHP-FPM是什么 (php-Fastcgi Process Manager 进程管理器)

php-fpm 是 FastCGI 的实现,并提供了进程管理的功能。

进程包含 master 进程和 worker 进程两种进程。
master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个 (具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。

PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,在./configure的时候带 –enable-fpm参数即可开启PHP-FPM,

一、更换yum源

查看系统可用的yum源和所有的yum源

yum repolist enabled
yum repolist all

image-20200731114732575

1、配置 阿里镜像仓库

  1. 备份yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
  1. 下载新的 CentOS-Base.repo 到 /etc/yum.repos.d/
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

或者

curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

image-20200731114913276

  1. 清除系统yum缓存并生成新的yum缓存
yum clean all # 清除系统所有的yum缓存
yum makecache # 生成yum缓存

image-20200731115413703

image-20200731115505539

2、epel扩展源 安装和配置

  1. 查看可用的epel源
yum list | grep epel-release

image-20200731192729670

  1. 安装 epel
yum install -y epel-release
  1. 更换其他epel源
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
  1. 配置阿里镜像提供的epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  1. 清除系统yum缓存并生成新的yum缓存
yum clean all # 清除系统所有的yum缓存
yum makecache # 生成yum缓存

二、yum安装Apache

LAMP - CentOS7+Apache2.4+MySQL8+PHP7.3

1、卸载

首先,要确认下是否有安装过,或者是系统自带了httpd服务

#检查并且显示Apache相关安装包
rpm -qa | grep httpd

或者:

yum list installed | grep httpd

卸载httpd,首先要停止httpd服务:

systemctl stop httpd.service

然后通过 rpm -e 或者yum remove 命令都可以,不过rpm -e命名必须要自己先卸载依赖包,所以我用yum remove命令卸载:

yum remove httpd.x86_64

image-20200731121212181

2、安装

列出yum 仓库里面的httpd项,命令如下:

yum list | grep httpd

image-20200731121539417

看到有可用项之后,输入以下命令进行安装:

yum install -y httpd

image-20200731121736109

将Apache加入到开机自启动中

systemctl enable httpd.service

启动服务:

systemctl start httpd.service

查看httpd的运行状态:

systemctl status httpd.service

image-20200731125647959

如果正在运行防火墙(firewalld),则还需要打开HTTP和HTTPS端口80和443:

firewall-cmd --zone=public --add-service=http    --permanent 

firewall-cmd --zone=public --add-service=https    --permanent

   或者
firewall-cmd --zone=public --add-port=80/tcp  --permanent
firewall-cmd --zone=public --add-port=443/tcp  --permanent

    --zone                 作用域
    --add-port=80/tcp   添加端口  格式为:端口/协议
    --parmanent          永久生效  没有此参数重启后失效
    
    
    
firewall-cmd --reload

3、测试

默认的www目录在/var/www/html/下面,所以我们写入一个html文件,查看下怎么样了,输入一下命令创建一个包含hello world字符串的文件:

echo 'hello world' > /var/www/html/index.html

然后,我们用curl访问下本地:

curl 127.0.0.1

已经在正常服务啦!

4、相关配置与环境

服务目录 /etc/httpd
主配置文件 /etc/httpd/conf/httpd.conf
虚拟主机项目配置文件 /etc/httpd/conf.d/
网站根目录 /var/www/html
访问日志 /var/log/httpd/access_log
错误日志 /var/log/httpd/error_log

在httpd服务程序主配置文件中最为常用的参数如下:

ServerRoot 服务安装目录
ServerAdmin 管理员邮箱
User 运行服务的用户
Group 运行服务的用户组
ServerName 网站服务器的域名
DocumentRoot 站点默认主目录
Listen 监听的IP地址与端口号
DirectoryIndex 默认的索引页页面
ErrorLog 错误日志文件
CustomLog 访问日志文件
Timeout 网页超时时间,默认为300秒.
Include 需要加载的其他文件

5、systemctl管理

我们可以像任何其他系统单元一样管理Apache服务。

#启动
systemctl start httpd

#停止
systemctl stop httpd

#重启
systemctl restart httpd

#在进行一些配置更改后重新加载Apache服务:
systemctl reload httpd

#开机启动
systemctl enable httpd         

#开机不启动
systemctl disable httpd

#检查Apache是否已经安装了开机自动启动
systemctl list-unit-files | grep httpd

6、配置Apache

支持PHP

vim /etc/httpd/conf/httpd.conf
  1. 载入PHP模块,如httpd.conf中有下列代码则直接去掉前面#即可,没有则加入
  2. 在底部加入以下代码使得Apache可以解析php文件
     
    AddType application/x-httpd-php .php 

image-20200803153731058

  1. 找到DirectoryIndex,在index.html后面加入index.php

image-20200803153827217

支持.htaccess规则重写

先检查rewrite模块是否打开,模块配置文件位于:/etc/httpd/conf.modules.d/00-base.conf

vim /etc/httpd/conf.modules.d/00-base.conf

在文件里搜索rewrite_module modules/mod_rewrite.so,在所在行前面是否有#,如果有的话,将#删除,然后保存文件。

image-20200731180601996

查看/etc/httpd/conf/httpd.conf文件是否已打开允许重写功能

在文件里搜索.htaccess,我们找到 如下注释对应的AllowOverride None

image-20200731180827882

然后将
AllowOverride None
改成
AllowOverride All

注意改动的位置 因为该文件 有多处 AllowOverride None,只有找到正确的位置才有效。

检查完前面两步,重启Apache服务

systemctl restart httpd

7、配置虚拟主机

查看apache主配置文件,

vim /etc/httpd/conf/httpd.conf

确保存在以下配置,因为等下需要在conf.d/创建虚机主机配置

IncludeOptional conf.d/*.conf

image-20200731162743655

另外,把 Require all denied默认拒绝访问设置为允许访问: Require all granted,方便测试。


  AllowOverride none
 # Require all denied
  Require all granted

关于虚拟主机项目配置文件,位于/etc/httpd/conf.d目录,建议一个域名一个配置文件
虚拟主机配置文件规范:[域名].conf

vim /etc/httpd/conf.d/site1.com.conf

    
ServerName site1.com    
DocumentRoot "/var/www/html/site1.com" 
vim /etc/httpd/conf.d/site2.com.conf

    
ServerName site2.com    
DocumentRoot "/var/www/html/site2.com" 

创建网站目录,编写文件

mkdir /var/www/html/site1.com

vim /var/www/html/site1.com/index.html

I am site1.com
mkdir /var/www/html/site2.com

vim /var/www/html/site2.com/index.html

I am site2.com

image-20200731170218852

修改物理主机hosts文件(C:WindowsSystem32driversetc),因为这里是因为物理机去访问Apache服务器

image-20200731171842844

访问效果

image-20200731170438328


扩展虚机主机配置文件

https://blog.csdn.net/tladagi...


        #绑定的域名
        ServerName site1.com    
        #绑定的域名别名
        ServerAlias www.site1.com
        #网站主目录
        DocumentRoot "/var/www/html/site1.com" 
        #错误日志目录
        ErrorLog  "/var/log/httpd/site1.com/error.log"
        #访问日志目录
        CustomLog "/var/log/httpd/site1.com/access.log" common
        
                Options FollowSymLinks
                AllowOverride All
                #允许任意访问
                Require all granted
        

创建日志目录

cd /var/log/httpd
mkdir site1.com

cd site1.com
touch error.log access.log

日志目录记得更改属主和属组为Apache,否则httpd启动失败

chown -R apache:apache /var/log/httpd/site1.com/

Require参考

Require all granted
无条件允许访问。

Require all denied
访问被无条件拒绝。

Require env env-var [env-var] ...
只有在给定的环境变量之一被设置的情况下才允许访问。

Require method http-method [http-method] ...
只有给定的HTTP方法才允许访问。

Require expr expression
如果表达式计算结果为true,则允许访问。

Require user userid [userid] ...
只有指定的用户才能访问资源。

Require group group-name [group-name] ...
只有指定组中的用户才能访问资源。

Require valid-user
所有有效的用户都可以访问资源。

Require ip 10 172.20 192.168.2
指定IP地址范围内的客户端可以访问资源。

Options

None:不支持任何选项

Indexes:允许索引目录

FollowSymLinks:允许访问符号链接指向的原文件

Includes:允许执行服务端包含(SSI)

ExecCGI:允许允许CGI脚本

ALL:支持所有选项

8、安全配置

隐藏HTTP请求头web服务器信息

没作任何设置前,查看web服务器响应头:

image-20200731171153188

几乎把web服务器详细信息都暴出来了,会给攻击者提供最有攻击价值的安全信息,这是非常危险的。

将Apache的配置文件加上:

ServerTokens ProductOnly
ServerSignature Off 

然后重启Apache服务,再次请求

image-20200731171457282

9、安装tp

image-20200803160213460

修改虚拟主机配置文件

mv tp5 site1.com

vim site1.com.conf


        #绑定的域名
        ServerName site1.com
        #绑定的域名别名
        ServerAlias www.site1.com
        #网站主目录
                DocumentRoot "/var/www/html/site1.com/public"
        #错误日志目录
        ErrorLog  "/var/log/httpd/site1.com/error.log"
        #访问日志目录
        CustomLog "/var/log/httpd/site1.com/access.log" common
        
                Options FollowSymLinks
                AllowOverride All
                #允许任意访问
                Require all granted
        

image-20200803160507268

在Centos中,我们通过上述操作下载的项目代码是没有操作权限的,默认的归属者也是root用户。

而我们使用TP和Apache访问网站时,需要代码目录有一定的操作权限,并且Apache用户是可操作方。

#修改权限:
chmod -R 777 /var/www/html/tp5        
        
#找到Apache对应的用户名,可能是apache或www:    
cat /etc/passwd
        
#修改apache用户可操作tp5目录:    
chown -R apache /var/www/html/tp5/

#临时关闭selinux模式
setenforce 0

重启Apache

systemctl restart httpd

image-20200803160633696

10、apache mod_php到php-fpm

apache php的几种运行方式

httpd.conf配置文件修改

vim /etc/httpd/conf/httpd.conf

#注释
#LoadModule php7_module modules/libphp7.so

#  
#       AddType application/x-httpd-php .php 
#
 

#加载这两个模块
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
 
# 接受到php页面请求时,交给php引擎解释,而不是下载页面
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

# 将目录的默认索引页面改为index.php
DirectoryIndex index.php index.html

# 如果php-fpm使用的是TCP socket,那么在httpd.conf末尾加上:

SetHandler "proxy:fcgi://127.0.0.1:9000"

image-20200812184828798

虚拟主机配置

vim /etc/httpd/conf.d/site3.com.conf



        #绑定的域名
        ServerName site3.com
        #绑定的域名别名
        ServerAlias www.site3.com
        #网站主目录
                DocumentRoot "/var/www/html/site3.com"
        #错误日志目录
        ErrorLog  "/var/log/httpd/site3.com/error.log"
        #访问日志目录
        CustomLog "/var/log/httpd/site3.com/access.log" common
        
                Options FollowSymLinks
                AllowOverride All
                #允许任意访问
                Require all granted
        
           

image-20200812184919588

站点文件

mkdir /var/www/html/site3.com

vim /var/www/html/site3.com/index.php

image-20200812185023004

image-20200812185152103

三、yum安装PHP7.3

由于linux的yum源不存在php7.x,所以我们要更改yum源:

Remi 软件源 主要提供最新版的 PHP 软件包和其他一些 PHP 扩展工具包,它是针对 Fedora 和 RHEL 系分支变体 (包括:RHEL, CentOS, Oracle Linux 等等) 要安装 PHP,推荐使用 Remi 软件源。

1、安装源:

安装源管理工具

yum install -y yum-utils  #yum-utils是管理repository及扩展包的工具 (主要是针对repository)

安装 REMI 源:

yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm

image-20200803123632276

2、清除历史版本

yum -y remove php*

3、安装

一、作为Apache模块 mod_php

yum安装php7.3

对于php7.1使用remi-php71或对其他php7.x版本使用remi-php72或remi-php73或remi-php74

yum-config-manager --enable remi-php73

从启用的仓库上方安装php版本

yum -y install php-cli php-bcmath php-gd php-json php-mbstring php-mcrypt php-mysqlnd php-opcache php-pdo php-pecl-crypto php-pecl-mcrypt php-pecl-geoip php-pecl-swoole php-recode php-snmp php-soap php-xmll

安装更多扩展:

yum search php73

验证一下是否安装成功:

php -v

image-20200803154038563

image-20200803154453108

开启PHP报错

1、搜索并修改下行,把Off值改成On
display_errors = Off

2、error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT
修改为:error_reporting=E_ALL

image-20200803172400383

坑1:linux php 安装扩展包安装路径与phpinfo中extension_dir加载的路径不一致

php -i | grep 'extension_dir'   #查看php扩展包安装路径

image-20200804130942989

安装php的pdo以及gd库

#pdo的扩展:
yum install php-pdo

#pdo的mysql扩展:
yum install php-pdo_mysql

#gd库扩展:
yum install php-gd

#mbstring:扩展
yum -y install freetype-devel php-mbstring

image-20200804132441978

image-20200804132530702


二、PHP-FPM独立运行方式

CentOS 7 yum 安装 PHP7.3

安装PHP及扩展

yum -y install php-cli php-fpm php-bcmath php-gd php-json php-mbstring php-mcrypt php-mysqlnd php-opcache php-pdo php-pecl-crypto php-pecl-mcrypt php-pecl-geoip php-pecl-swoole php-recode php-snmp php-soap php-xmll

image-20200811153127390

配置文件路径

#查找php.ini位置:
find / -name php.ini

#php-fpm 配置文件
/etc/php-fpm.d/www.conf 

systemctl管理

systemctl enable php-fpm #开启开机自启

systemctl restart php-fpm #重启

systemctl start php-fpm #启动

systemctl stop php-fpm #关闭

systemctl status php-fpm #检查状态

4、配置composer

  1. 下载composer
curl -sS https://getcomposer.org/installer | php
  1. 将composer.phar文件移动到bin目录以便全局使用composer命令
mv composer.phar /usr/local/bin/composer
  1. 切换国内源
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

image-20200803155436619

四、yum安装MySQL

CentOS7 安装 mysql8

#先检查系统是否装有mysql
rpm -qa | grep mysql

#删除可用
yum remove mysql-xxx-xxx-

1、安装源

rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm

列出当前支持的MySQL数据库

yum repolist all | grep mysql

image-20200803180454121

从上面可以看出,会默认下载5.7版本的MySQL数据库,而8.0版本的默认是关闭的

#先把5.7的禁用,启用MySQL 8.0数据库
vim /etc/yum.repos.d/mysql-community.repo

其中可以看到5.7版本, enabled=1, 改为enabled=0, 禁用掉
另外可以看到8.0版本, enabled=0, 改为enabled=1, 开启

2、安装

yum install -y mysql-community-server

image-20200803181904885

3、启动

systemctl list-unit-files | grep mysqld        #检查是否已经安装了开机自动启动

systemctl enable mysqld.service                #设置开机自启动

systemctl start mysqld         #启动
        
systemctl status mysqld        #查看MySQL启动状态

默认目录/文件位置

/var/lib/mysql        #数据库存储目录
/etc/my.cnf            #配置文件

修改密码

MySQL安装完成之后会在LOG文件( /var/log/mysqld.log)中生成一个默认的临时密码

vim /var/log/mysqld.log            

A temporary password is generated for root@localhost:  tKPR9)EaJifG        #冒号后面为旧密码

登录MySQL并修改root密码

mysql -uroot -p

ALTER USER root@localhost IDENTIFIED BY 'Lk321@1024';

设置允许远程登录

use mysql 

select user,host from user;

update user set host = "%" where user = "root";

image-20200803184706716

防火墙开启3306端口

firewall-cmd --zone=public --query-port=3306/tcp    #查看是否开启3306

firewall-cmd --zone=public --add-port=3306/tcp  --permanent        #开启3306端口     

systemctl restart firewalld            #重启防火墙

4、navcate远程终端连接测试

出现2059这个错误的原因是:

在mysql8之前的版本中加密规则为mysql_native_password,而在mysql8以后的加密规则为caching_sha2_password
#可以将mysql用户登录的加密规则修改为mysql_native_password
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Lk321@1024';

五、编译安装Nginx

Nginx 是一个免费的、开源的、高性能的 HTTP 和反向代理服务,主要负责负载一些访问量比较大的站点。

相比于 Apache,Nginx 可以处理更多的并发连接,而且每个连接的内存占用的非常小。

Nginx 可以作为一个独立的 Web 服务,也可以用来给 Apache 或是其他的 Web 服务做反向代理。

在linux下,有的会用apache去跑php,然后用nginx做反向代理,

比如apache运行在8080端口,nginx在80端口,访问php文件时,反向代理到apache,静态页通过nginx处理。

nginx支持高并发,apache对php的运行比较稳定。

1、安装依赖

  1. gcc 安装

安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:

yum install -y gcc gcc-c++
  1. PCRE pcre-devel 安装

PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。

nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。

yum install -y pcre pcre-devel
  1. zlib 安装

zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要安装 zlib 库。

yum install -y zlib zlib-devel
  1. OpenSSL 安装

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。

yum install -y openssl openssl-devel

2、安装软件

下载

直接下载.tar.gz安装包,地址:https://nginx.org/en/download.html

#下载Nginx到"/usr/local/src"
cd /usr/local/src

#使用wget命令下载。确保系统已经安装了wget,如果没有安装,执行 yum install wget 安装。
wget -c http://nginx.org/download/nginx-1.18.0.tar.gz

image-20200805131543058

#解压安装包
tar -zxvf nginx-1.18.0.tar.gz

#进入解压目录
cd nginx-1.18.0

configure配置nginx(配置包含:指定安装的位置、需要的模块功能)

使用默认配置

./configure

自定义配置(不推荐)

./configure \
--prefix=/usr/local/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--pid-path=/usr/local/nginx/conf/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
注:将临时文件目录指定为/var/temp/nginx,需要在/var下创建temp及nginx目录

image-20200805131801915

编译&安装

make && make install

查找安装路径:

whereis nginx

image-20200805131939644

注意:安装完成后,会有4个目录,

/usr/local/nginx/conf 配置文件

/usr/local/nginx/html 网页文件,网站的根目录,就类似与apache里面的htdocs目录。

var/log/nginx 日志文件

/usr/local/nginx/sbin 主要二进制程序(启动程序命令)


如果nginx配置文件有修改,可以通过如下方式测试配置文件是否正确:

/usr/local/nginx/sbin/nginx -t

查看Nginx编译时的参数

/usr/local/nginx/sbin/nginx -V

3、Nginx的启动管理

注意:

Nginx编译安装后没有办法通过systemctl指令来进行操作,因为它不是用rpm安装的,它里面没有服务,需要找到Nginx的执行文件才能启动
cd /usr/local/nginx/sbin/

启动、停止nginx

./nginx 启动

参数 "-c" 指定了配置文件的路径,如果不加 "-c" 参数,Nginx 会默认加载其安装目录的 conf 子目录中的 nginx.conf 文件。

./nginx -s stop 此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程。

./nginx -s quit 此方式停止步骤是待nginx进程处理任务完毕进行停止。

./nginx -s reload 不停止nginx的服务,重新加载配置文件

启动时报80端口被占用:

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()

查看80端口

netstat -lnp | grep 80

image-20200805171150613


重启 nginx

1.先停止再启动(推荐):
对 nginx 进行重启相当于先停止再启动,即先执行停止命令再执行启动命令。

./nginx -s quit
./nginx

2.重新加载配置文件:
当 ngin x的配置文件 nginx.conf 修改后,要想让配置生效需要重启 nginx,使用-s reload不用先停止 ngin x再启动 nginx 即可将配置信息在 nginx 中生效

./nginx -s reload

开机自启动

#即在`rc.local`增加启动代码就可以了。
vi /etc/rc.local

#增加一行 `/usr/local/nginx/sbin/nginx`

#设置执行权限:
chmod 755 rc.local

配置nginx的systemctl命令

Systemd服务文件以.service结尾,如果用yum install命令安装的,yum命令会自动创建nginx.service文件。

源码编译安装之后的nginx无法使用systemctl管理,要手动创建nginx.service服务文件

vim /usr/lib/systemd/system/nginx.service 

1、配置nginx.service文件

[Unit]
# 描述服务
Description=nginx-The High-performance HTTP Server
# 描述服务类别 前置服务
After=network.target remote-fs.target nss-lookup.target    
 
[Service]
# 后台运行的形式
Type=forking    
# PID文件的路径
PIDFile=/usr/local/nginx/conf/nginx.pid
        
# 启动准备
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
# 启动命令
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
# 重启命令
ExecReload=/usr/local/nginx/sbin/nginx -s reload
#停止命令
ExecStop=/usr/local/nginx/sbin/nginx -s stop
# 快速停止
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
# 给服务分配临时空间
PrivateTmp=true
 
[Install]
# 服务用户的模式
WantedBy=multi-user.target

2、重新加载 systemd

systemctl daemon-reload
  1. nginx服务常用操作
#查看nginx服务状态
systemctl status nginx.service

#启动nginx服务
systemctl start nginx.service

#停止nginx服务
systemctl stop nginx.service

#重启nginx服务
systemctl restart nginx.service

#重新读取nginx配置
systemctl reload nginx.service

4、虚拟主机配置

在http段里面的server段就是配置虚拟主机的,http中每一个server段就是一个虚拟主机

可以把多个虚拟主机配置成一个个单独的配置文件

  1. 在conf目录下面新建一个vhosts目录
cd /usr/local/nginx/conf
mkdir vhosts
  1. 新建一个文件(site1.com.conf)在该文件里面添加虚拟主机的配置。
cd vhosts

vim site1.com.conf

server {
    listen 80;
    server_name site1.com;
    location / {
        root html/site1.com;
        index index.html;
    }
}

image-20200805175245792

  1. 打开nginx的配置文件nginx.conf,引入虚拟主机的配置文件
include vhosts/*.conf
  1. 执行nginx的重新加载配置文件
/usr/local/nginx/sbin/nginx -s reload

image-20200805175444000

  1. 根据虚拟主机里面的配置,新建一个网站的根目录
mkdir site1.com
cd site1.com
vim index.com

image-20200805175615913

  1. 在window系统里面,配置hosts文件,访问效果如下:

image-20200805175812720

5、nginx运行PHP

Nginx+Php-fpm运行原理详解

  • php-fpm 配置文件
vim /etc/php-fpm.d/www.conf 

user = apache
group = apache

#修改为

user = nginx
group = nginx

image-20200811160619014

  • 修改nginx配置文件支持php-fpm
vim /usr/local/nginx/conf/vhosts/site1.com.conf

#找到server项目设置如下内容
location ~ \.php$ {
    root           html/site1.com;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

image-20200811170046401

  • 站点目录
cd /usr/local/nginx/html/site1.com/

vim index.php

image-20200811170441980

  • 安装tp
cd /usr/local/nginx/html

composer create-project topthink/think=5.1.* site2.com

image-20200811180433386

修改虚拟主机配置文件

cd /usr/local/nginx/conf/vhosts

vim site2.com.conf

server {
        listen 80;
        server_name site2.com;
        charset utf-8;
        root /usr/local/nginx/html/site2.com/public;

        location / {
                index  index.php index.html;
                 
                 #如果请求既不是一个文件,也不是一个目录,则执行一下重写规则
                 if (!-e $request_filename) {
                      #地址作为将参数rewrite到index.php上。
                       rewrite  ^(.*)$  /index.php?s=/$1  last;
                 }
        }

        location ~ \.php(.*)$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                #下面两句是给fastcgi权限,可以支持 ?s=/module/controller/action的url访问模式
                fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                #下面两句才能真正支持 index.php/index/index/index的pathinfo模式
                fastcgi_param  PATH_INFO  $fastcgi_path_info;
                fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
                include        fastcgi_params;
        }
}

重载Nginx

systemctl reload nginx

image-20200812123758055

你可能感兴趣的:(php,linux,nginx,apache,mysql)