热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Debian系统配置LANMP(Debian+Apache+Nginx+MySQL+PHP)过程记录

Web服务器的LAMP、LLMP、LNMP几种结构应用都已经比较广泛了。特别是LLMP、LNMP在VPS上很受欢迎,原因无非是Lighttpd、Nginx处理静态文件非常给力,用FastCGI方式解析PHP效率也很高。前几天在讨论LANMP与LLLMP相比的优势时,得知Apache的mod_php可以让Apache直
Web服务器的LAMP、LLMP、LNMP几种结构应用都已经比较广泛了。特别是LLMP、LNMP在VPS上很受欢迎,原因无非是Lighttpd、Nginx处理静态文件非常给力,用FastCGI方式解析PHP效率也很高。前几天在讨论LANMP与LLLMP相比的优势时,得知Apache的mod_php可以让Apache直接解析PHP(即Apache Handler),与FastCGI方式相同的是,Apache进程也是常驻内存,而Apache在高并发时对队列的处理比FastCGI更成熟,Apache的mod_php效率比php-cgi更高且更稳定。比如下面的代码由php-cgi解析时会产生内存泄漏,而mod_php则没有这个问题。
function whatthefuck($cons) {
  $i = 0;
  $object = new StdClass;
  for (;$i < $cons; $i++) {
    $object->{"your_" . $i} = array("sorry" => 12345);
    $object->{"yourdaddy_" . $i} = new StdClass;
    $object->{"onlyyour"} = array("sorry" => 12345);
  }
  unset($object);
}
whatthefuck(10000);
print "done";
?>
所以我考虑从LNMP出发,然后让Apache代替php-cgi做后端解析PHP,形成LANMP结构。额外的好处是,Apache跑Ruby on Rails比Lighttpd或Nginx都简单许多。这篇笔记记录在Debian squeeze环境下配置LANMP的要点。

安装Apache
sudo apt-get install apache2 libapache2-mod-php5 libapache2-mod-rpaf
mod_rpaf是为了让Apache在被前端Nginx代理的情况下也能获取访客的真实IP。apache2和libapache2-mod-php5这两个包建议一起安装。apache2默认安装apache2-mpm-worker,这是Apache的Multi-Processing Module之一,此种方式效率更高,但配合mod_php时会有安全隐患,所以Debian的libapache2-mod-php5强制依赖apache2-mpm-prefork,会替换掉apache2-mpm-worker。自己编译的话没有这个限制。

安装nginx

Debian squeeze的nginx是0.7.67版本的,这个版本有点老,从测试结果来看效率确实不如sid的0.8.54版本(现在sid为1.0.4版本)。所以首先增加一个sid的源。为了不让sid大规模污染squeeze环境,在/etc/apt/preferences.d/新建priority文件并且写入以下Pin-Priority:
Package: *
Pin: release v=6.*
Pin-Priority: 900
Package: *
Pin: release o=Debian
Pin-Priority: -1
这段Pin-Priority的意义是默认只选用squeeze的包,当且仅当用apt-get -t sid指定release时才使用sid的包,且dist-upgrade时sid包不升级,避免升级时引入新的sid包。
然后,
sudo apt-get -t sid install nginx-light
sid中有两个nginx包,nginx-full和nginx-light,nginx-full包含的模块多一些,对比后我觉得nginx-light可以满足需求。如果要使用Limit Requests或Memcached的话,应该安装nginx-full。

安装MySQL和PHP

跟LAMP、LLMP和LNMP的区别是,不需要php5-cgi,php的配置文件在/etc/php5/apache2/。

配置Apache

Apache在LANMP里的意义相当于LNMP里的php-fam、LLMP里的spawn-fcgi,以及php-cgi,首先要调整下Apache进程的数量,在/etc/apache/apache2.conf找到下面一段:
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves

    StartServers         14
    MinSpareServers      14
    MaxSpareServers      14
    MaxClients           14
    MaxRequestsPerChild  10000

几个参数的意义在注释里都有了,改成上面这样会保证Apache固定开14个进程。Apache解析PHP时占用的内存跟php-cgi差不多,所以原来开多少php-cgi,现在开多少Apache就行了。
Timeout值也可以改一下,比如60,后面配置Nginx时会用到这个值。
再给Apache指定一个非80端口,比如81,在ports.conf里面改成:
NameVirtualHost *:81
Listen 127.0.0.1:81
监听127.0.0.1就够了,因为Apache是要由Nginx代理的,不对外服务。
虚拟主机需要在Apache上配好,与没有Nginx前端时一样,SSL不需要在Apache上配置。
最后把Apache精简一下,只当作后端用,没必要加载很多模块,保留
deflate dir mime php5 reqtimeout rewrite rpaf setenvif
足够了。

配置Nginx
Nginx采用反向代理的方式接收Apache的处理结果,需要先写一些代理的参数,可以将下面的配置保存为proxy_params,以后每个用到proxy_pass的地方都include一下。
proxy_redirect          http:// $scheme://;
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header        X-Forwarded-Proto $scheme;
proxy_connect_timeout   30;
proxy_send_timeout      30;
proxy_read_timeout      60;
proxy_buffers           8 128k;
其中proxy_read_timeout应保持与Apache的TimeOut一致,proxy_buffers里的128k可以改为PHP生成的网页的大小的最大值。
然后可以配置虚拟主机了,以前的location ~ .*\.(php|php5)?$里的fastcgi_pass之类,现在应该改写成proxy_pass:
# proxy the PHP scripts to Apache listening on 127.0.0.1:81
location ~ \.php$ {
        proxy_pass http://127.0.0.1:81;
        include proxy_params;
}
跟LNMP相比,rewrite规则更麻烦了,因为Nginx的rewrite和Apache的rewrite是串行处理的,即Nginx先rewrite一下,如果处理后的请求被交给Apache,那么Apache又会再根据自己的rewrite rule再处理;相反Apache的rewrite结果不会再交回Nginx处理。所以,避免麻烦的方法是,只让Nginx做rewrite,因为Nginx的rewrite效率比Apache的高,而且rewrite的结果有可能是静态文件。特殊的情况是,比如WordPress的伪静态,在Nginx里怎么写都不成,因为index.php不接受query string。又因为proxy_pass和fastcgi_pass对URI的处理不同,所以LNMP一键安装包的WordPress rewrite规则:
if (!-f $request_filename){
        rewrite (.*) /index.php;
}
以及所有的类似规则,是不行的(不得不说他写的这个规则很丑),这样rewrite,Apache收到的URI只有"/index.php",永远返回首页。解决方法是,把rewrite交给Apache(嫌Nginx的rewrite麻烦的也可以这么做):
try_files $uri $uri/ @apache;
location @apache {
        proxy_pass http://127.0.0.1:81;
        include proxy_params;
}
女神工作室给出过一条rewrite规则是:
if (!-e $request_filename) {
        proxy_pass http://127.0.0.1:81;
}
我实验这样写不能通过,因为Nginx默认不允许在if里面写proxy_pass,if是rewrite语句之一,不能与其它的语句混用(但是编译时可以加某个参数,if就变成真的“条件语句”了),所以我用了try_files来变通。
SSL需要在Nginx上配置。

Tips
配置Apache的mod_deflate时别忘了把text/Javascript也加进去,有些PHP生成的js指定的mime type是text/Javascript而不是application/x-Javascript和application/Javascript。Nginx不需要改,静态的js一定会是application/x-Javascript。
Apache跑Ruby on Rails需要mod_passenger,配置只要
DocumentRoot xxx
RailsEnv production
RailsBaseURI /
就行了。
nginx的worker process跟CPU核数一样多比较好。
ipv6Only=on只在listen [::]:80 default_server的地方写。
Nginx上用的SSL证书需要把certificate、chain和CA都装在一个pem文件里,private key也可以装进去,然后ssl_certificate和ssl_certificate_key指定同一个文件就行了。

推荐阅读
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 本文详细介绍如何通过修改配置文件来隐藏Apache、Nginx和PHP的版本号,从而增强网站的安全性。我们将提供具体的配置步骤,并解释这些设置的重要性。 ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 本文将深入探讨PHP编程语言的基本概念,并解释PHP概念股的含义。通过详细解析,帮助读者理解PHP在Web开发和股票市场中的重要性。 ... [详细]
  • 探讨了小型企业在构建安全网络和软件时所面临的挑战和机遇。本文介绍了如何通过合理的方法和工具,确保小型企业能够有效提升其软件的安全性,从而保护客户数据并增强市场竞争力。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 在成功安装和测试MySQL及Apache之后,接下来的步骤是安装PHP。为了确保安全性和配置的一致性,建议在安装PHP前先停止MySQL和Apache服务,并将MySQL集成到PHP中。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
author-avatar
陆碧钰-_752
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有