|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
根据功能来进行封装等。很多的不懂,在使用搜索引擎查找,或者请教老师和在老师详细的讲解、指导下,都能顺利解决。 Apache Software Foundation 的 HTTP 办事器项目(凡是称为 Apache)是现今互联网上占有优势的 Web 办事器,它占有了 60% 以上的市场份额。Apache 办事器是日渐盛行的 LAMP 软件设置装备摆设的一局部。LAMP 是一套收费软件法式,是在 Linux?、Apache、MySQL 和 PHP 等开放源码手艺之上构建的 Web 平台。在本文中,您将进修一种利用 mod_proxy 模块和多个后端办事器来改善 LAMP 平安性的办法。我将会商这类办法的长处和弱点,并供应一个设置装备摆设示例。
PHP 和 Apache:平安性困难
LAMP 办理员面临的一个应战是,供应完全 PHP 体系的一切特征,同时确保为体系的一切用户供应一个平安的情况。利用 PHP 的平安形式是完成这一方针的一种手艺,然而它也过度地限制了用户,并且启用了这个举措措施以后,一些 PHP 使用法式就不克不及发扬感化。
PHP 平安成绩的本源在于大多半 Apache 办事器的设置装备摆设体例。由于大多半 Apache 设置装备摆设运转在特别的 www-data 用户 ID 下,对 Web 站点停止主机托管的一切用户在默许情形下必需确保这个用户可以读取他们的文件。因而,体系上的一切其他用户都能够会见一个用户的一切 Web 可会见文件;所以体系上本来与您有关的平安破绽会成为进击您的 Web 站点的冲破口。假如文件或目次必需设置为 www-data 用户可写的,那末这类情形会加倍严重。
经由过程利用 CGI 法式,好比用 Perl 和 Python 等盛行言语编写的法式,可以在利用 suEXEC 机制时消弭这个成绩的局部影响。复杂地说,suEXEC 利用一个特别的两头法式以法式一切者的用户 ID 履行 CGI 法式。这是一种十分无效的机制,已利用了很多年了。
然而,在利用 mod_php 模块主机托管时,PHP 页面作为 Apache 主历程的一局部履行。因而,它们承继 Apache 历程的一切凭证,并且它们在文件体系上履行的任何任务必需作为 www-data 用户履行。
在多个用户 ID 下运转 Apache
关于下面描写的成绩,分明的处理计划是请求对一个用户域的一切恳求都来自一个只具有此用户的凭证的 Apache 实例。可以将 Apache 设置装备摆设为在启动时获得任何用户的凭证。关于给每一个用户分派一个独自的互联网可见 IP 地址/端口组合的复杂设置,这类办法可以处理成绩。
关于更庞杂的设置(在个中 IP 地址很名贵),这类办法是有效的。当单一 Apache 实例可以掌握一个特定的 IP 地址/端口组应时,只能利用虚拟主机,这是 Apache 体系中普遍利用的一种手艺。这就扫除了让属于多个用户的多个域利用统一个 IP 地址/端口组合的能够性。
Apache 2.0 引入了多处置模块(multiprocessing module,MPM) 的概念。在根基 Apache 2.0 包供应的 MPM 中有一个实行性的模块 perchild,它可以将一个散布器线程分派给 IP 地址/端口组合,并将恳求传递给在独自用户的凭证下运转的子线程,从而完成多个用户 ID 下的虚拟主机。遗憾的是,perchild 依然是实行性的,它纷歧定可以发扬感化,并且在 Apache 2.2 宣布时从正式 Apache 刊行包中删除。在此之前,因为熟悉到依然需求一个不乱的可以发扬感化的与 perchild 类似的 MPM,Apache 社区入手下手研发很多 MPM 来填补这一完善。MetuxMPM 和面向进程的 peruser 正在野着这个偏向勉力。
一个处理计划:mod_proxy
虽然还没有正式的 Apache MPM 可以直接供应多个用户 ID 下的虚拟主机,然而依然可以经由过程某些设置装备摆设和办理在 Apache 体系中完成这类行动。这类办法的中心概念是利用 mod_proxy 模块,这个模块(加上其他功效)使 Apache 可以将页面恳求转发给其他办事器,并将呼应传递回本来收回恳求的客户机。
清单 1. 根基恳求转发的反向代办署理设置装备摆设示例
ProxyRequests Off
ProxyPass /foo http://foo.example.com/bar
ProxyPassReverse /foo http://foo.example.com/bar
清单 1 中的代码是一个复杂的示例,它将对一个主机的 /foo 条理布局下任何页面的恳求转发到 http://foo.example.com/bar 的对应页面。例如,对 /foo/index.htm 页面的恳求会转发到 http://foo.example.com/bar/index.htm。可使用这一道理处理成绩。
示例场景
咱们来思索一个场景:Apache 办理员必需为两个独自的客户创立两个域。一个客户是在线创业企业,很存眷在线平安性。另外一个是团体客户,他在站点平安性方面对照宽松,能够将不平安的代码上载到这个站点。因而,Apache 办理员必需接纳办法将这两个站点隔分开。
因而,办理员有两个域:www.startup.tld,它属于在线创业企业(用户 ID startup);和 www.reckless.tld,它属于团体(用户 ID nimrod)。为懂得决这个成绩,办理员决意利用 mod_proxy 处理计划。办理员给每一个用户一个独自的 Apache 实例,这个实例运转在用户本人的用户 ID 下,利用公有的 IP 地址/端口组合,并利用 mod_proxy 处理计划经由过程一个 facade 办事器供应对这两个用户的域的会见,这个办事器作为 www-data 运转,利用一个公共的 IP 地址/端口组合。图 1 申明了全部场景。
图 1. 场景示例
保举的 Apache 版本
关于示例使用法式设置装备摆设中的每一个元素,Apache 办理员应当利用 表 1 中列出的 Apache 版本。
表 1. 示例使用法式中利用的 Apache 版本
元素 Apache 版本 缘由
facade 办事器 Apache 2,运转 worker 或 event MPM Apache 2 对 mod_proxy 模块做了主要的改善。worker 和 event MPM 是线程化的,有助于削减 facade 办事器的内存开支。
后端办事器 Apache 1.3,或运转 prefork MPM 的 Apache 2 Apache 办理员必需意想到 PHP 模块不该该运转在线程化情况中。这两个处理计划为 PHP 模块供应了基于历程的情况。
后端 Apache 实例的设置装备摆设
清单 2 和 清单 3 中的代码片断申明了与尺度 Apache 设置装备摆设的根基差别。应当依据需求将它们添加到恰当的设置装备摆设中,好比这里疏忽的 PHP 功效设置装备摆设。
清单 2. 在线创业企业的 Apache 设置装备摆设
# Stuff every Apache configuration needs
ServerType standalone
LockFile /var/lock/apache/accept.startup.lock
PidFile /var/run/apache.startup.pid
ServerName necessaryevil.startup.tld
DocumentRoot "/home/startup/web"
# Essential modules
LoadModule access_module /usr/lib/apache/1.3/mod_access.so
# Which user to run this Apache configuration as
User startup
Group startup
# This must be off else the host isn't passed correctly
UseCanonicalName Off
# The IP/port combination to listen on
Listen 127.0.0.2:10000
# Using name-based virtual hosting allows you to host multiple sites per IP/port combo
NameVirtualHost 127.0.0.2:10000
<VirtualHost 127.0.0.2:10000>
ServerName www.startup.tld
# You can add aliases so long as the facade server is aware of them!
ServerAlias startup.tld
DocumentRoot "/home/startup/web/www.startup.tld"
<Directory /home/startup/web/www.startup.tld/>
Options Indexes FollowSymLinks MultiViews ExecCGI Includes
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
清单 3. 团体客户的 Apache 设置装备摆设
# Stuff every Apache configuration needs
ServerType standalone
LockFile /var/lock/apache/accept.nimrod.lock
PidFile /var/run/apache.nimrod.pid
ServerName necessaryevil.nimrod.tld
DocumentRoot "/home/nimrod/web"
# Essential modules
LoadModule access_module /usr/lib/apache/1.3/mod_access.so
# Which user to run this Apache configuration as
User nimrod
Group nimrod
# This must be off else the host isn't passed correctly
UseCanonicalName Off
# The IP/port combination to listen on
Listen 127.0.0.2:10001
# Using name-based virtual hosting allows you to host multiple sites per IP/port combo
NameVirtualHost 127.0.0.2:10001
<VirtualHost 127.0.0.2:10001>
ServerName www.reckless.tld
# You can add aliases so long as the facade server is aware of them!
ServerAlias reckless.tld
DocumentRoot "/home/nimrod/web/www.reckless.tld"
<Directory /home/nimrod/web/www.reckless.tld/>
Options Indexes FollowSymLinks MultiViews ExecCGI Includes
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
清单 4 申明了门面 Apache 实例的设置装备摆设。
清单 4. 门面 Apache 实例的 Apache 设置装备摆设
# Stuff every Apache configuration needs
LockFile /var/lock/apache/accept.www-data.lock
PidFile /var/run/apache.www-data.pid
ServerName necessaryevil.facade.server
DocumentRoot "/home/www-data"
# Essential modules
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so
# Which user to run this Apache configuration as
User www-data
Group www-data
# These must be set else the host isn't passed correctly
UseCanonicalName Off
ProxyVia On
ProxyRequests Off
# This must also be set, though it's only an option in Apache2
ProxyPreserveHost On
# The IP/port combination to listen on
Listen 9.20.1.1:80
# Using name-based virtual hosting allows you to host multiple sites per IP/port combo
NameVirtualHost 9.20.1.1:80
# Configuration to forward requests for startup.tld
<VirtualHost 9.20.1.1:80>
ServerName www.startup.tld
ServerAlias startup.tld
ProxyPass / http://127.0.0.2:10000/
ProxyPassReverse / http://127.0.0.2:10000/
ProxyPassReverse / http://www.startup.tld:10000/
ProxyPassReverse / http://startup.tld:10000/
</VirtualHost>
# Configuration to forward requests for reckless.tld
<VirtualHost 9.20.1.1:80>
ServerName www.reckless.tld
ServerAlias reckless.tld
ProxyPass / http://127.0.0.2:10001/
ProxyPassReverse / http://127.0.0.2:10001/
ProxyPassReverse / http://www.reckless.tld:10001/
ProxyPassReverse / http://reckless.tld:10001/
</VirtualHost>
必定要注重这里的 ProxyPreserveHost 指令。这个指令是 Apache 2 供应的,它处理了将准确的 HTTP 头转发给后端办事器的一些成绩。因而,激烈建议利用 Apache 2 实例作为 facade 办事器。
运转示例设置装备摆设
根用户应当运转每一个设置装备摆设。Apache 将获得设置装备摆设文件中指定的特权,并将其用于一切与主机相干的历程。清单 5 申明运转示例的办法。
清单 5. 启动示例办事器
/usr/sbin/apache -f /etc/apache/startup.tld.conf
/usr/sbin/apache -f /etc/apache/nimrod.tld.conf
/usr/sbin/apache2 -f /etc/apache2/facade.tld.conf
mod_proxy 办法的限制
必定要注重,本文中描写的办法不合用于需求 SSL 毗连的域。这是由于 SSL 协定不答应域的虚拟主机。因为这个限制,任何 SSL 主机必需以恰当的体例履行,让每一个 SSL 域利用它本人的 IP/端口组合。这个限制对一切 Apache 设置装备摆设都存在,利用这个处理计划的 Apache 也不破例。依然可以在它们的一切者的用户 ID 下运转 SSL 域。
停止语
在本文中,利用 Apache 的 mod_proxy 模块构建了一个情况,在这个情况中有一个门面办事器将恳求转发给两个后端办事器。可以对一系列后端办事器采取一样的办法。这类办法使体系办理员可以下降潜伏的平安风险,同时坚持 PHP 等东西供应的天真性。
也得学会了PHP。然后再学,见异思迁是最不可取的,狗熊掰玉米就是这个道理,如果经常中途放弃,只能是一无所获,还浪费了N多的时间和经历,得不偿失,最重要的是,你会被别人瞧不起。 |
|