nginx复习004 nginx+apache动静分离+apache编译安装整合php

—–nginx+apache

–在原来lamp的基础上,在apache前面增加一个nginx服务器,
由nginx监听80端口,遇到动态请求时,转发给apache处理
–这种方式既避免了更换web服务器带来的不稳定性,又利用了nginx提升了性能,是一种便捷的优化的方案

–apache安装 https://httpd.apache.org/
–官网对apache http server的简称是httpd,国内习惯用apache

–获取apr和apr-util)
这两个是软件支持库
https://apr.apache.org
(安装1.5.2版的,1.6.x的编译不通过)

–yum install apr apr-devel apr-util apr-util-devel –y
注:一般不推荐用yum安装apr,因为apache-2.4以后需要高版本的apr支持,而yum源的apr版本很可能不够。

–安装步骤
1> 解压文件
2> 编译安装
apr和apr-util既可以独立编译安装,也可以放入apache源码中,和apache一起编译安装
mv apr-1.5.2 httpd-2.4.34/srclib/apr
mv apr-util-1.5.2 httpd-2.4.34/srclib/apr-util

–apache编译安装
./configure –help查看详细的编译选项

– ./configure –enable-so –enable-deflate –enable-ssl
– make && make install
–编译apr-util出错的话
https://blog.csdn.net/dn1115680109/article/details/80847924
https://www.cnblogs.com/zyos/p/7663717.html

–后续配置
1> 添加到系统服务
apache在bin目录中已经通过一个能够通过start stop restart等参数
控制apache服务的脚本程序:apachectl

–编写httpd服务脚本是直接将参数传入到apachectl脚本中即可:
vim /etc/init.d/httpd

#! /bin/bash

#chkconfig:35 85 15
/usr/local/apache2/bin/apachectl $1

添加可执行权限
chmod +x /etc/init.d/httpd

通过service方式管理
service httpd start
service httpd restart
service httpd stop

–第一次启动 提示
AH00558: httpd: Could not reliably determine the server’s fully qualified domain name, using localhost.localdomain. Set the ‘ServerName’ directive globally to suppress this message

这是因为apache安装后默认没有配置servername
此时如果启动apache,会提示信息
告知用户,apache自动使用locahost.localdomain作为servername

–如果不想出现提示
找到conf下的httpd.conf文件
搜索找到如下一行配置 取消注销即可

#ServerName www.example.com:80

–打开防火墙的80端口

iptables -I INPUT -p tcp --dport 80 -j ACCEPT
service iptables save

或者使用firewalld配置

–apache的MPM(多模块处理)机制
提供了event prefork worker等多种MPM可以使用
通过如下命令可以查看当前安装的apache正在使用哪一种MPM模块
cd /usr/local/apache2/bin
./httpd -M | grep mpm
显示
mpm_event_module (static)
表示MPM的event模块
后面的static表示此模块属于静态链接

–切换apache的MPM模块
在编译选项中通过 –with-mpm 和 –enable-mpms-shared 进行切换
从实际使用的角度 worker和event有较高的性能和灵活性
prefork有较高的可靠性和兼容性
默认情况下apache会自动选择适合当前系统的MPM模块

—–apache的基本配置
在httpd.conf配置文件中有一些基本指令,用于配置网站的目录 端口号 域名
ServerRoot 服务器安装目录
Listen 服务器监听的端口
LoadModule 需要加载的模块
ServerAdmin 服务器管理员的邮箱地址
ServerName 服务器域名
DocumentRoot 网站根目录
ErrorLog 记录错误日志

apache提供了配置文件备份 位于conf/original目录中
如果因为修改错误造车apache无法启动,可以还原配置文件备份

–配置虚拟机 可以百度很多而且这个经常用

–访问权限控制
Apache可以控制服务器中的哪些目录允许被外部访问
在httpd.conf中,默认站点目录hotdocs已经配置为允许外部访问
但如果要将其他目录页允许访问时,需要手动进行配置

–通过指令配置目录访问权限
Require all granted; 允许所有访问
Require local; 只允许本地
Require all denied; 拒绝所有访问
–详情不具体写了 太熟悉了

—分布式配置文件
1> 作用:
用于为某个目录单独进行配置的文件
可以实现在不重启服务器的前提下更改某个目录的配置
2> 在使用前需要开启分布式配置文件:

<Directory "目录路径">
    Require  all granted
    #这个配置
    AllowOverride All
    #
</Directory>

开启后,apache就会到站点下的各个目录中读取分布式配置文件,
文件名为”.htaccess”,
该文件的配置将会覆盖原有的目录配置
3> 编写分布式配置文件
在分布式配置文件中可以直接编写中大部分配置
例如:通过Options指令开启或关闭目录浏览.通过ErrorDocument指令自定义错误页面
4> 关闭分布式配置文件
分布式配置文件虽然方便网站管理员对目录的管理
但是会影响服务器的运行效率
关闭指令 AllowOverride None;

–模块的开启和关闭
1> apache支持动态模块机制:
将一些模块编译成独立的”.so”文件,保存在modules目录中
利用httpd.conf中的LoadModule指令可以开启或关闭这些模块
2> 开启动态模块:
ex:

LoadModule deflate_module modules/mod_deflate.so
LoadModule ssl_module modules/mod_ssl.so

3> 测试模块是否已经开启
使用apachectl命令的”-M”选项,可以欣赏已开启的模块
./bin/apachectl -M | grep -P “deflate|ssl”

—–apache+php
1> apache整合php的方式–通过模块实现
apache处理php的动态请求的稳定性高于nginx+php-fpm的方式
这是因为php利用了apache的动态模块机制实现了高度整合

在安装apache是,编译选项中有一个 “enable-so”,
添加此选项后,apahce就会在bin目录下生成一个apxs程序

apxs的含义为apache extension tool ,是Apache提供的一个扩展工具,用于编译模块.
php的configure程序可以利用apxs编译一个用于apache使用的php模块,从而实现apache与php的整合.

2> 编译安装php(配合apache的)
在安装nginx+php时,生成了php的FastCGI进程管理器PHP-FPM
但是在apache环境中,无需使用这个管理器.

php提供了编译选项”–with-apxs2”用于编译apache模块
(其中数字2表示该编译选项是为2.x版本的apache设计的)

–编译安装

make clean
./configure --prefix=/usr/local/php \
--with-apxs2=/usr/local/apache2/bin/apxs --with-zlib --enable-zip \
--enable-mbstring --with-mcrypt --with-mysql --with-mysqli --with-pdo-mysql \
--with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-curl \
--with-openssl --with-mhash --enable-bcmath --enable-opcache
make && make install

–如果是初次安装php,还需要将php.ini复制到lib目录中
提示:
php读取配置文件php.ini的目录可以更改为其他路径,
可以通过编译选项”–with-config-file-path”来修改
也可以在httpd.conf文件中通过PHPIniDir指令进行指定

3> apache相关配置
为了使apache能够识别”.php”扩展名的文件,
将文件交给phpp模块处理,
需要在httpd.conf中配置文件的扩展名

编辑httpd.conf文件

<FilesMatch "\.php$">
    setHandler application/x-httpd-php
</FilesMatch>

<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

—和window下的配置类似,但是有点不同
a.告诉php在哪
b.遇到php请求,去找php吧
c.通过桥梁去找

—–nginx和apache动静分离
1> 修改Apache配置

--vim /usr/local/apache2/conf/httpd.conf
Listen 81
--vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
<VirtualHost *:81>
    DocumentRoot "/var/www/www.baicai.com"
    ServerName baicai.com
ServerAlias www.baicai.com
</VirtualHost>

–apache不需要提供对外访问,只在本机能够访问即可,因此不需要打开防火墙的80端口
–本机测试 curl 127.0.0.1:81
2>更改nginx对动态请求的处理
将”.php”的请求通过proxy_pass指令转到本机的81端口
并设置HTTP消息头中的Host
–vi /usr/local/nginx/conf/nginx.conf

server {
    listen 80;
    server_name test.com www.test.com;
    root /var/www/www.test.com;
    index index.html index.htm index.php;
    location ~ \.php$ {
        proxy_pass http://127.0.0.1:81;
        proxy_set_header Host $host;
    }
}

–proxy_pass指令用于代理客户端浏览器请求apache服务器
–proxy_set_header指令用于发送Host消息头
–nginx在代理请求时能够自动传递来自客户端浏览器的请求消息头
但无法传递Host消息头,因此需要设置proxy_set_header指令
–nginx的$host变量保存了当前请求的主机名,即虚拟主机www.test.com
放在Host消息头中用于告知Apache当前请求的虚拟主机

4> 传递客户端ip地址
–在web服务器中,环境变量REMOTE_ADDR表示客户端ip地址

–在nginx反向代理中,nginx被apache当做了客户端
显示的是客户端ip是本机ip了,并非真实的客户端ip地址

–如果要获取真实的客户端ip地址
需要nginx将客户端ip用另一种方式传递给apache
这就要借助http请求消息头了
–定义一个专门传递客户端ip的消息头”X-Client-IP”
当nginx获取到客户端ip后,将ip放入该消息头中发送给apache
然后在apahce中替换REMOTE_ADDR即可

–实现
–nginx中配置

location ~ \.php$ {
    proxy_pass http://127.0.0.1:81;
    proxy_set_header Host $host;
    proxy_set_header X-Client-IP $remote_addr;
}

–nginx提供了$remote_addr变量保存了客户端的ip
–然后将其添加到X-Client-IP消息头中
–假如有用户发送了X-Client-IP消息头给apache,怎么办?
不用担心,如果nginx收到的请求中已经存在X-Client-IP消息头,则会被上面配置的替换掉,从而防止伪造客户端ip的情况发生
况且apache只能本机访问,用户不能直接发给Apache.

–apache中配置(在apache中如何读取X-Client-IP)
–使用mod_remoteip模块
这个模块可以检测REMOTE_ADDR是否为代理服务器的ip地址
如果是,则从自定义的HTTP的X-Client-IP消息头中读取客户端的ip地址,替换到REMOTE_ADDR中,然后清除X-Client-IP消息头.((进一步加强了安全性,防止伪造))
–实现

LoadModule remoteip_module modules/mod_remoteip.so
RemoteIPHeader X-Client-IP
RemoteIPInternalProxy 127.0.0.1

猜你喜欢

转载自blog.csdn.net/eebaicai/article/details/81207684