—–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