全球主机交流论坛

标题: Debian配置LANMP笔记(Debian+Apache+Nginx+MySQL+PHP) [打印本页]

作者: windywinter    时间: 2011-1-16 12:35
标题: Debian配置LANMP笔记(Debian+Apache+Nginx+MySQL+PHP)
完整版本及其更新发布在梦.:如此短暂 - Debian配置LANMP笔记(Debian+Apache+Nginx+MySQL+PHP) ,本文内容在GNU自由文档许可证下发布。

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则没有这个问题。
  1. <?php
  2. function whatthefuck($cons) {
  3.   $i = 0;
  4.   $object = new StdClass;
  5.   for (;$i < $cons; $i++) {
  6.     $object->{"your_" . $i} = array("sorry" => 12345);
  7.     $object->{"yourdaddy_" . $i} = new StdClass;
  8.     $object->{"onlyyour"} = array("sorry" => 12345);
  9.   }
  10.   unset($object);
  11. }
  12. whatthefuck(10000);
  13. print "done";
  14. ?>
复制代码
所以我考虑从LNMP出发,然后让Apache代替php-cgi做后端解析PHP,形成LANMP结构。额外的好处是,Apache跑Ruby on Rails比Lighttpd或Nginx都简单许多。这篇笔记记录在Debian squeeze环境下配置LANMP的要点。

安装Apache
  1. 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的源。为了不让sid大规模污染squeeze环境,在/etc/apt/preferences.d/新建priority文件并且写入以下Pin-Priority:
  1. Package: *
  2. Pin: release a=squeeze
  3. Pin-Priority: 900

  4. Package: *
  5. Pin: release o=Debian
  6. Pin-Priority: -1
复制代码
这段Pin-Priority的意义是默认只选用squeeze的包,当且仅当用apt-get -t sid指定release时才使用sid的包,且dist-upgrade时sid包不升级,避免升级时引入新的sid包。
然后,
  1. sudo apt-get install nginx-light
复制代码
sid中有两个nginx包,nginx-fullnginx-light,nginx-full包含的模块多一些,对比后我觉得nginx-light可以满足需求。如果要使用Limit Requests或Memcached的话,应该安装nginx-full。

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

配置Apache
Apache在LANMP里的意义相当于LNMP里的php-cgi,首先要调整下Apache进程的数量,在/etc/apache/apache2.conf找到下面一段:
  1. # prefork MPM
  2. # StartServers: number of server processes to start
  3. # MinSpareServers: minimum number of server processes which are kept spare
  4. # MaxSpareServers: maximum number of server processes which are kept spare
  5. # MaxClients: maximum number of server processes allowed to start
  6. # MaxRequestsPerChild: maximum number of requests a server process serves
  7. <IfModule mpm_prefork_module>
  8.     StartServers         14
  9.     MinSpareServers      14
  10.     MaxSpareServers      14
  11.     MaxClients           14
  12.     MaxRequestsPerChild  10000
  13. </IfModule>
复制代码
几个参数的意义在注释里都有了,改成上面这样会保证Apache固定开14个进程。Apache解析PHP时占用的内存跟php-cgi差不多,所以原来开多少php-cgi,现在开多少Apache就行了。
Timeout值也可以改一下,比如60,后面配置Nginx时会用到这个值。
再给Apache指定一个非80端口,比如81,在ports.conf里面改成:
  1. NameVirtualHost *:81
  2. 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一下。
  1. proxy_redirect          http:// $scheme://;
  2. proxy_set_header        Host $host;
  3. proxy_set_header        X-Real-IP $remote_addr;
  4. proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  5. proxy_set_header        X-Forwarded-Proto $scheme;
  6. proxy_connect_timeout   30;
  7. proxy_send_timeout      30;
  8. proxy_read_timeout      60;
  9. proxy_buffers           8 128k;
复制代码
其中proxy_read_timeout应保持与Apache的TimeOut一致,proxy_buffers里的128k可以改为PHP生成的网页的大小的最大值。
然后可以配置虚拟主机了,以前的location ~ .*\.(php|php5)?$里的fastcgi_pass之类,现在应该改写成proxy_pass:
  1. # proxy the PHP scripts to Apache listening on 127.0.0.1:81
  2. location ~ \.php$ {
  3.         proxy_pass http://127.0.0.1:81;
  4.         include proxy_params;
  5. }
复制代码
跟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规则:
  1. if (!-f $request_filename){
  2.         rewrite (.*) /index.php;
  3. }
复制代码
以及所有的类似规则,是不行的(不得不说他写的这个规则很丑),这样rewrite,Apache收到的URI只有"/index.php",永远返回首页。解决方法是,把rewrite交给Apache(嫌Nginx的rewrite麻烦的也可以这么做):
  1. location / {
  2.         try_files $uri $uri/ @apache;
  3. }
  4. location @apache {
  5.         proxy_pass http://127.0.0.1:81;
  6.         include proxy_params;
  7. }
复制代码
女神工作室给出过一条rewrite规则是:
  1. if (!-e $request_filename) {
  2.         proxy_pass http://127.0.0.1:81;
  3. }
复制代码
我实验这样写不能通过,因为Nginx默认不允许在if里面写proxy_pass,if是rewrite语句之一,不能与其它的语句混用(但是编译时可以加某个参数,if就变成真的“条件语句”了),所以我用了try_files来变通。
SSL需要在Nginx上配置。

[ 本帖最后由 windywinter 于 2011-1-16 12:49 编辑 ]
作者: cnweb    时间: 2011-1-16 12:42
非LAMP的就不玩
作者: wishour    时间: 2011-1-16 12:42
楼主这个不错,支持
作者: Globalization    时间: 2011-1-16 12:44
支持
作者: cmlz    时间: 2011-1-16 12:47
做记号,有空试试
作者: cnx    时间: 2011-1-16 12:48
精品要支持.
作者: sagawa    时间: 2011-1-16 13:11
有点深~不多还能看明白
作者: yansthisisit    时间: 2011-1-16 13:14
哭了!
作者: pmalc    时间: 2011-1-16 13:19
终于看见技术贴了,感谢楼主分享
作者: wzwen    时间: 2011-1-16 13:28
有空测试一下……
作者: ucfans    时间: 2011-1-16 19:17
技术贴,看不懂!
作者: solar    时间: 2011-1-16 19:29
动态多用LAMP; 静态多用LNMP。可靠安全。 不是大站,折腾LANMP, LLNMP意义不大。
不过还是顶LZ的技术文章
作者: windywinter    时间: 2011-1-16 19:36
原帖由 solar 于 2011-1-16 19:29 发表
动态多用LAMP; 静态多用LNMP。可靠安全。 不是大站,折腾LANMP, LLNMP意义不大。
不过还是顶LZ的技术文章

我的建议是不依靠面板就能操作VPS的人直接用LANMP替代LNMP,Nginx跟php-cgi的配合确实很糟糕。
作者: wjhhxl    时间: 2011-1-16 20:02
高手高手高高手@!
作者: weishimi    时间: 2011-1-16 20:06
记录地址、、回头再折腾折腾、
作者: eudx    时间: 2011-1-16 20:10
内流满面!! 要顶的。我正到处找LNAMP 手动安装笔记
嗯 学习学习
作者: eudx    时间: 2011-1-16 20:14
下周转移站测试~ 毒妇租不起了  要从国内转到国外。
作者: fhs    时间: 2011-1-16 20:19
我想问一下至少什么配置的VPS用LANMP才有意义?
作者: windywinter    时间: 2011-1-16 20:52
原帖由 fhs 于 2011-1-16 20:19 发表
我想问一下至少什么配置的VPS用LANMP才有意义?

LANMP相对LNMP、LLMP不会消耗更多资源。
作者: 风声    时间: 2011-1-17 00:03
马克一下,回头研究...
作者: whyyyhk    时间: 2011-1-17 06:52
提示: 作者被禁止或删除 内容自动屏蔽
作者: test100    时间: 2011-1-17 16:09
先收藏,慢慢研究
作者: ypandjp    时间: 2011-1-18 06:40
看的我头晕。。算了这么辛苦顶你一下
作者: pigicoffee    时间: 2011-1-18 14:43
没有看明白rewrite规则,请问dz的话 应该怎么弄呢?
作者: southwind    时间: 2011-1-18 14:55
mark
作者: 意气形    时间: 2011-1-18 19:05
终于看见技术贴了,感谢楼主分享
作者: vaman    时间: 2011-1-18 19:08
看不懂啊看不懂
作者: windywinter    时间: 2011-1-18 19:09
原帖由 pigicoffee 于 2011-1-18 14:43 发表
没有看明白rewrite规则,请问dz的话 应该怎么弄呢?

使用LNMP的rewrite规则。
作者: eudx    时间: 2011-1-19 00:36
MaxClients           14
会不会太少了
默认写的好像是150.

还是全部14 就是固定开进程的办法。能稳定点 ?

[ 本帖最后由 eudx 于 2011-1-19 00:42 编辑 ]
作者: pigicoffee    时间: 2011-1-20 08:54
郁闷 没有成功,
作者: windywinter    时间: 2011-1-20 09:19
原帖由 eudx 于 2011-1-19 00:36 发表
MaxClients           14
会不会太少了
默认写的好像是150.

还是全部14 就是固定开进程的办法。能稳定点 ?

你就当apache进程是php-cgi进程,就知道该开多少了。
作者: yculer    时间: 2011-1-20 12:13
赞同lz的方案。
apache+mpm prefork+mod_php+apc处理php的效率高而且非常稳定。
不足之处是不支持zend optimizer,此外,mpm prefork比mpm worker吃内存,如果用于下载服务器非常糟糕,只能用防火墙规则或引入apache的第三方模块来限制同一ip的连接线程。
nginx可以弥补这种模式对静态文件的疲弱。
作者: pigicoffee    时间: 2011-1-21 14:40
感觉没有写齐全
作者: windywinter    时间: 2011-1-21 14:57
原帖由 pigicoffee 于 2011-1-21 14:40 发表
感觉没有写齐全

我认为没有必要写的、可以从默认配置一步推导得出的,就没有写。
作者: pigicoffee    时间: 2011-1-21 14:58
原来如此,配置这些呢?我弄过半天没有成功
作者: windywinter    时间: 2011-1-21 15:06
原帖由 pigicoffee 于 2011-1-21 14:58 发表
原来如此,配置这些呢?我弄过半天没有成功

我需要恪守一个原则,即我不能无偿完整的给出适用于某一个站或某一个人的配置文件,希望你能理解。
作者: 风声    时间: 2011-1-22 00:22
楼主,我准备开始折腾你的了,有下列问题想问一下:
1. rewrite 确定用nginx的是吗?
2. 子域名如何做
3.数据库有phpmyadmin来管理么?
作者: windywinter    时间: 2011-1-22 01:07
原帖由 风声 于 2011-1-22 00:22 发表
楼主,我准备开始折腾你的了,有下列问题想问一下:
1. rewrite 确定用nginx的是吗?
2. 子域名如何做
3.数据库有phpmyadmin来管理么?

1. 这个讨论了很多遍了……nginx是最正确的地方。
2. 这个“子域名”指什么?
3. sudo apt-get install phpmyadmin,完了会自动配好apache(yourdomain.tld/phpmyadmin),nginx就不用说了吧……location /phpmyadmin 全部扔给apache,注重安全的话还可以再配个SSL上去。
作者: 风声    时间: 2011-1-22 01:11
原帖由 windywinter 于 2011-1-22 01:07 发表

1. 这个讨论了很多遍了……nginx是最正确的地方。
2. 这个“子域名”指什么?
3. sudo apt-get install phpmyadmin,完了会自动配好apache(yourdomain.tld/phpmyadmin),nginx就不用说了吧……location /phpmyadmin 全部扔 ...


子域名是类似  http://bbs.baowang.com  http://mall.baowang.com  类似这样的.
作者: pigicoffee    时间: 2011-1-22 01:14
看来还要继续自己折腾,因为更喜欢可以用apt-get来更新
作者: windywinter    时间: 2011-1-22 01:17
原帖由 风声 于 2011-1-22 01:11 发表


子域名是类似  http://bbs.baowang.com  http://mall.baowang.com  类似这样的.

跟“域名”一样
你要恶趣味一点,绑定个.com,那所有的“域名”都是“子域名”了。
作者: 风声    时间: 2011-1-22 01:21
原帖由 windywinter 于 2011-1-22 01:17 发表

跟“域名”一样
你要恶趣味一点,绑定个.com,那所有的“域名”都是“子域名”了。



你的不会和诡谲那个一样吧, 要一个用户创立一个域名, 如果你有10个子域名,那要创立10个用户,直接就傻逼了, 连记用户名字都快死了.
作者: 风声    时间: 2011-1-22 01:25
如果楼主装过军哥的LNMP就会知道它有下列优点:
一个用户可以创立多个域名
FTP装不装看你自己,和用户脱钩
数据库和用户脱钩
另外相关程序文件应放在熟悉的路径下, 很简洁.
平滑启动用一个语句参考军歌 /root/lnmp reload 就可以了.

你的我还没开始折腾,但我用了诡谲的,就上面的问题很头疼,太复杂,牵扯到一起,搞不好某天删除用户时候就把数据库也一起删除了,直接傻逼了,其它方面还可以.

[ 本帖最后由 风声 于 2011-1-22 01:28 编辑 ]
作者: windywinter    时间: 2011-1-22 01:34
原帖由 风声 于 2011-1-22 01:25 发表
如果楼主装过军哥的LNMP就会知道它有下列优点:
一个用户可以创立多个域名
FTP装不装看你自己,和用户脱钩
数据库和用户脱钩
另外相关程序文件应放在熟悉的路径下, 很简洁.
平滑启动用一个语句参考军歌 /root/lnmp re ...

你仔细看笔记就知道了,我根本没装suPHP,所以Apache全部是用同一个用户(www-data)执行php脚本的。
而且我根本不用FTP,我用Dropbox和SFTP。
作者: 风声    时间: 2011-1-22 01:36
如果那样倒是挺好, 你装过诡谲的LNAMP没?  军鸽的呢?

军鸽的很简洁  /root/lnmp restart|reload|stop 等命令就完成.

你跨站如何解决??  子域名如何创立?
作者: windywinter    时间: 2011-1-22 01:55
原帖由 风声 于 2011-1-22 01:36 发表
如果那样倒是挺好, 你装过诡谲的LNAMP没?  军鸽的呢?

军鸽的很简洁  /root/lnmp restart|reload|stop 等命令就完成.

你跨站如何解决??  子域名如何创立?

没用过……它在强大估计也没写Ruby on Rails的,所以还得我自己来……
不解决,所有站都是我的,一共就两个。
作者: 风声    时间: 2011-1-22 01:56
原帖由 windywinter 于 2011-1-22 01:55 发表

没用过……它在强大估计也没写Ruby on Rails的,所以还得我自己来……
不解决,所有站都是我的,一共就两个。


仍然需要考虑子域名,你是如何解决?
作者: windywinter    时间: 2011-1-22 01:57
原帖由 风声 于 2011-1-22 01:56 发表


仍然需要考虑子域名,你是如何解决?

到底“子域名”和“域名”有啥区别啊?
作者: 风声    时间: 2011-1-22 01:57
原帖由 windywinter 于 2011-1-22 01:57 发表

到底“子域名”和“域名”有啥区别啊?



没区别,所以问你如何增加域名吧...
作者: windywinter    时间: 2011-1-22 01:59
原帖由 风声 于 2011-1-22 01:57 发表



没区别,所以问你如何增加域名吧...

这是啥问题
作者: 风声    时间: 2011-1-22 02:00
原帖由 windywinter 于 2011-1-22 01:59 发表

这是啥问题



我举例你现有 www.aaa.com  www.bbb.com 现在想增加个 www.ccc.com 你怎么增加?
作者: windywinter    时间: 2011-1-22 02:08
原帖由 风声 于 2011-1-22 02:00 发表



我举例你现有 www.aaa.com  www.bbb.com 现在想增加个 www.ccc.com 你怎么增加?

跟增加www.aaa.com和www.bbb.com时一样……
作者: 风声    时间: 2011-1-22 02:10
原帖由 windywinter 于 2011-1-22 02:08 发表

跟增加www.aaa.com和[url]www.bbb.com[/url]时一样……


   说下增加AAA BBB的流程,好先学习下,明晚从中山回来就搞你的.

nginx 和 apache下的 conf 的VHOST同步创立?  还是只是一个地方创立就可以了?

[ 本帖最后由 风声 于 2011-1-22 02:23 编辑 ]
作者: wishour    时间: 2011-1-24 14:46
楼主这个好,我准备在freebsd上用ports安装参照这个了
作者: whyyyhk    时间: 2011-2-5 17:43
提示: 作者被禁止或删除 内容自动屏蔽
作者: flylight    时间: 2011-2-5 22:12
支持楼主
作者: 大飞机    时间: 2011-2-5 22:54
太长了 。。




欢迎光临 全球主机交流论坛 (https://mjj.022333.xyz/) Powered by Discuz! X3.4