简单配置nginx+fastcgi后端的WordPress服务器

Update: nginx+php的环境可以更快捷的方法完成,参看Nginx + PHP (via php-fpm) on Ubuntu 环境最佳实践


比起传统的LAMP Web服务构架,nginx替换Apache能够在同样硬件配置情况下提高10倍的并发性能;PT尝试在Arch下用nginx简单搭建一个让wordpress运行的LNMP环境的笔记:(实际上nginx+fastcgi的架构在目前看来性能并不高,甚至比apache+mod_cgi差,也许nginx做前端服务,apache做后端处理合适一点[误])
Update:nginx+fastcgi跑服务的组合通常用在一些低端的vps上,其内存甚至不到100M,所以apache等庞物是不适合的。按下文方法启动的fcgi只有一个worker进程,而且nginx配置当中没有fastcgi的缓冲,所以会有性能低下的感觉,其实可以通过PHP_FCGI_CHILDREN环境变量等来进行优化。另外推荐使用这里提到的启动脚本来启动php-cgi。参考一些nginx调优方案,再加上一些Wordpress Cache之类的,一台64M的vps足够跑上一打wordpress博客了。

  1. 安装nginx。
    nginx在源里面,很简单就安装完成;

    1
    
    /etc/rc.d/nginx start

    启动nginx的服务,因为有默认的配置,这时用浏览器看看http://localhost,可见到nginx的错误页了,完成;

  2. 安装php
    安装php也是从源里来的,至于运行php,按arch wiki推荐的方法是使用fcgi,顺便装上,运行:

    1
    
    cgi-fcgi -start -connect localhost:9000 /usr/bin/php-cgi
  3. nginx的默认目录在/srv/http/nginx,在里面新建一个index.php,包含简单的代码:
    1
    2
    3
    
    <?php
       phpinfo();
    ?>

    然后我们要让nginx使用php来解释这个文件,编辑/etc/nginx/conf/nginx.conf
    配置nginx的重点就是这个文件,但先不管,在适当的地方贴入这段:

     location ~ \.php$ {
          root           html;
          fastcgi_pass   127.0.0.1:9000;
          fastcgi_index  index.php;
          fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
          include        fastcgi_params;
    }
    

    重启一下nginx

    1
    
    /etc/rc.d/nginx restart

    现在试试http://localhost/index.php,应该能显示php环境的信息了。若想使index.php成为默认选择的首页,在原有的index  index.html index.htm;后面加上index.php;

  4. 安装MySQL以及phpmyadmin
    启动mysql的服务:

    1
    
    /etc/rc.d/mysqld start

    还需要配置一下mysql的root账户密码等,这里略过。
    Arch默认的phpmyadmin安装后的文件是在/srv/http/phpMyAdmin下的,需要把phpmyadmin的目录链接到nginx的目录下:
    #ln -s /srv/http/phpMyAdmin /srv/http/nginx/phpmyadmin
    这里有个小发现就是,nginx对浏览器的url是区分大小写的,第一次我直接链接成phpMyAdmin的时候,使用http://localhost/phpmyadmin访问不到,非要改成phpMyAdmin,后来还是将链接改成phpmyadmin
    当然现在还是不能使用phpmyadmin的,因为php还没有访问MySQL的模块;
    编辑/etc/php/php.ini,找到extension=mysql.so,原来是用分号注释了的,把分号去掉;
    把php-cgi kill了,重新运行cgi-fcgi,尝试访问http://localhost/phpmyadmin,可以看到登录界面了,恩?有个提示说mcrypt库没启动,先安装libmcrypt,在/etc/php/php.ini同样把mcrypy.so的注释去掉,重启php,这次好了,先用root登录进去,新建个用户和数据库给wordpress。

  5. 环境配置基本上完成了,解压了个全新的Wordpress 2.8.2,设置好wp-config.php,ok,安装成功;
  6. 意外情况:
    因为我是完全导入原来的博客,包括原来的插件等等,所以当打开我的博客的本地服务版时,那些链接是不正常的,因为nginx不支持Apache的.htaccess控制,需要在/etc/nginx/conf/nginx.conf里面调整,这个暂时不说;当我基本设置好改写规则时,博客的浏览基本正常了,但是没法进入后台,一登录就白屏,几经折腾,发现是插件惹的祸,把插件目录逐个删掉,发现是wp-syntax的问题。当进入后台重新激活wp-syntax,提示超出运行内存而无法激活,原来php.ini里面限制了一个脚本的运行内存为32M,而wp-syntax内存占用比较多,在php.ini里面找到memory_limit改成64M就好了。
  7. 配置虚拟主机
    单纯让nginx运行一个网站似乎不是难事,在对配置文件nginx.conf几乎一窍不通的情况下都能完成,但是要做到虚拟主机的功能,就要大概了解下nginx.conf了。
    虚拟主机即在同一台主机运行不同的网站,这通常通过域名的HTTP HEAD信息来区分;对本机测试来说,localhost是一个主机,如果要设置另外一个主机,就得在/etc/hosts里面添加相应的描述,我添加了这样一条:

    127.0.0.1           ptblog.localdomain      ptblog

    当配置完成后,浏览器内访问http://ptblog,即可打开博客的主页(当然配置成ptblog.com也是可以的……)。
    nginx.conf文件的主要结构是这样的:

    http {
    ....
        server {
            ........
        }
        server {
            ........
        }
    }
    

    结构颇像某种编程语言的函数定义,上面的结构就是定义了nginx的http服务,以及包含的两个虚拟主机。每个虚拟主机server,一般需要定义listen,web服务端口,默认当然是80了;最重要的server_name,用来区分各个主机的名称或域名,一个server可以多个server_name,用空格分隔;root,定义该站点的文件的位置。贴一下我配置好的一个server:

        server {
            listen          80;
            server_name     ptblog ptblog.localdomain;
            root    /srv/http/nginx/ptblog/;
            location / {
                index   index.html index.htm index.php;
            }
            error_page   500 502 503 504  /50x.html;
            location = 50x.html {
                root   /srv/http/nginx/50x.html;
            }
            if (!-e $request_filename) {
                rewrite ^(.*)$ /index.php?q=$1 last;
            }
            location ~ \.php$ {
                  fastcgi_pass   127.0.0.1:9000;
                  fastcgi_index  index.php;
                  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                  include        /etc/nginx/conf/fastcgi_params;
            }
        }
    

    其中,if (!-e $request_filename) 这一段就相当于.htaccess的作用,意思是说,当请求到的url不是一个文件时,把匹配到的路径替换到index.php的q=参数里面。这一段有其他写法的,觉得这个最简洁,可搜索“nginx wordpress”,很多关于改写规则的文章。
    我第一次接触nginx.conf,最不解的是那个root参数,因为默认的nginx.conf总是包含一句“root   html;“想不透什么意思,后来发现/etc/nginx下有个html的链接,是指向/srv/http/nginx的,以此作为默认路径,像上面那样写成root /srv/http/nginx/ptblog/;就好理解了。有些配置文件是每一个location段都定义一个root,即对请求不同的文件时候使用不同目录下的文件(虚拟目录的概念),也可以像上面的配置,定义了全局的root,location内不用再定义,自动继承了root的位置。
    nginx.conf也是支持include包含文件的,所以在Ubuntu内,新建一个虚拟主机,只需要在site.d目录里面增加一个包含server段的配置文件即可,不用编辑nginx.conf。

如果作为服务器,完成上面的配置时候,是需要将相关的进程、启动参数加入rc.local的,以便开机时候自动启动,但是自己的电脑没事开这么多服务干吗?所以写了个脚本放在了~/bin,当需要调试博客的时候运行sudo lnmp就可以了:

1
2
3
4
#!/bin/bash
/etc/rc.d/mysqld start
cgi-fcgi -start -connect localhost:9000 /usr/bin/php-cgi
/etc/rc.d/nginx start

完整这样的配置,感觉打开本地的博客速度还是很慢的,特别首次启动时候,等N秒都没有出来的页面,不过相信是因为没有对php的优化所致。
本文目的不是为了完全讲解透nginx的配置,只是记录一下PT在配置过程中遇到的困难。最好的参考资料还是nginx的官方wiki,http://wiki.nginx.org,Configure栏目下有大量的nginx.conf的例子。

文章分类 Unix/Linux 标签: , , , ,
6 comments on “简单配置nginx+fastcgi后端的WordPress服务器
  1. isspy说道:

    不觉得nginx能成气候,企业级的应用还是apache经过了相当考验.

  2. PT说道:

    呵呵,腾讯、网易、网易这些算不算企业级呢……

  3. lvy说道:

    路过!~

  4. betaer说道:

    写的很详细啊

  5. smartwei说道:

    “实际上nginx+fastcgi的架构在目前看来性能并不高,甚至比apache+mod_cgi差,也许nginx做前端服务,apache做后端处理合适一点“

    作者很强~nginx用来作负载均衡、预防因慢链接引起的问题都是不错的,一般大型网站都是配合apache的,基本上没有抛开apache单用nginx的。

  6. BOYPT说道:

    @smartwei: 也不一定,当时我没深入测试过,其实可以让fastcgi开多个子进程进行服务,这样性能就好很多了;在一些低端vps上,比如100M内存以下,用nginx+fastcgi来做一打wordpress站应该问题不大的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*