把Apache换成Nginx笔记

其实想把Apache换成Nginx已经很多年了,只是一直懒得弄,也可能是因为上了年纪的关系,有点得过且过的意思。当然更主要的原因是没有压力,目前我的所有应用在Apache下都跑得挺好,对Apache的配置也比较熟悉。但是Nginx 10倍的性能优势始终在那里,这是一个挡不住的诱惑。

上周与令狐和帮主小聚的时候顺手在手机的Ubuntu里装了个Nginx,但是Ubuntu 9.04带的那个版本实在太老了,也就没有再弄。后来因为换手机把那个Ubuntu搞掉了,还没重装,这两天就在工作机的Ubuntu 12.04上来装了个配置一下。后来还正式部署到了一台Debian服务器上。顺便做点笔记。

安装

在Ubuntu 12.04下是简单。

apt-get install nginx php5-cgi php5-cli php5-fpm php-doc

不过在Debian 6下就麻烦一些,因为apt里没有php5-fpm,只能源码安装,或者使用这个源:

#在 sources.list 里加入以下源 sudo echo "deb stable all" >> /etc/apt/sources.list #或者:deb stable all #如有必要还可以再加上:deb-src stable all #加入key wget cat dotdeb.gpg | sudo apt-key add - rm dotdeb.gpg sudo apt-get update sudo apt-get install php5-fpm 初步配置

首先关闭Apapche的自启动,可以用 sysv-rc-conf 来配置。

然后配置php-fpm,主要修改这几个文件:

/etc/php5/fpm/php.ini /etc/php5/fpm/php-fpm.conf /etc/php5/fpm/pool.d/www.conf

第一个为与php有关的配置,这里要有这一句:

cgi.fix_pathinfo = 0; 

cgi.fix_pathinfo = 0;

原因见nginx默认配置文件中的注释说明。

第二个为fpm有关的配置,通常没什么要改的。

最后一个为与web有关的配置,可以在这里修改fpm的监听端口号什么的。

基本的nginx配置

主要的配置文件是这些:

/etc/nginx/nginx.conf /etc/nginx/conf.d/*.conf /etc/nginx/sites-enabled/*

基本上不需要修改nginx.conf,所有跟全站http相关的配置都可以放在conf.d/*.conf里,各虚拟主机的配置则放在sites-enabled/*里即可。

参考全站公共配置内容:

log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; charset utf-8;

这里有一点需要注意的是:charset设置并不能保证输出一定是utf-8。对于静态文件来说一般没问题,但是对于动态内容来说(比如来自PHP或Python WSGI),即使返回内容的确是用utf-8编码,但是没有在HTTP响应头里指定编码方式的话,nginx会默认为 ISO-8859-1 ,即使这里指定了utf-8也没用,结果就是导致在FireFox等浏览里器显示乱码(部分浏览器会识别网页中的meta,不一定按照HTTP响应头的指定编码方式)。

解决方案有两个:一是治标的办法——在nginx配置里加入一个ISO-8859-1到utf-8的charset_map(内容为空即可,当然这样的话碰到真正的ISO-8859-1内容时会乱码)。另一个当然是治本的——在动态内容里增加HTTP响应头内容,指定编码方式。

参考虚拟主机配置:

server { 

    listen   80; ## listen for ipv4; this line is default and implied 

    server_name yoursite.com ; 

 

    root /home/username/www; 

    index index.html index.htm index.php; 

 

     error_log   /var/log/nginx/yoursite.error.log warn; 

     access_log  /var/log/nginx/yoursite.access.log main; 

 

        location = /favicon.ico { 

                log_not_found off; 

                access_log off; 

        } 

 

        location = /robots.txt { 

                allow all; 

                log_not_found off; 

                access_log off; 

        } 

 

        location / { 

                # This is cool because no php is touched for static content. 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/d869f1e4ce56f7c6e5f77cab7f81a007.html