Nginx 中文网

栏目:rewrite , 安装与配置      1,454 views

服务器配置是前端用Nginx,后端用Apache解析PHP。
从老版本的Nginx升级到新版本(>1.0)以后,发现Wordpress建立的站点都出现无限循环重定向问题。Google搜索,发现很多人遇到这个问题,并不是单纯Wordpress,Drupal, PHPCake等框架也都遇到同样的问题。
wordpress的解决方案是 安装禁止重定向的插件就可以了,但是缺陷是,这样会不利于SEO。并且这个解决方案不是对各个框架的通用解决方案,如果不搞清楚问题的原因,其他网站遇到同样的问题怎么办?可惜经过搜索,遇到这个问题的讨论都没有揭露最终的原因。还是决定自己跟踪Wordpress的源代码,看看问题究竟出在哪里。 为什么老版本的Nginx没有问题,新版本的就出现了这个问题?

服务器配置是前端用Nginx,后端用Apache解析PHP。

从老版本的Nginx升级到新版本(>1.0)以后,发现Wordpress建立的站点都出现无限循环重定向问题。Google搜索,发现很多人遇到这个问题,并不是单纯Wordpress,Drupal, PHPCake等框架也都遇到同样的问题。

wordpress的解决方案是 安装禁止重定向的插件就可以了,但是缺陷是,这样会不利于SEO。并且这个解决方案不是对各个框架的通用解决方案,如果不搞清楚问题的原因,其他网站遇到同样的问题怎么办?可惜经过搜索,遇到这个问题的讨论都没有揭露最终的原因。还是决定自己跟踪Wordpress的源代码,看看问题究竟出在哪里。 为什么老版本的Nginx没有问题,新版本的就出现了这个问题?

标签:
阅读全文      尚无回复

栏目:安装与配置      2,311 views

网站如果流量比较大,那么Nginx记录的错误,特别是访问日志是非常多的,上百G的空间运行几个月以后也会被塞满,造成服务器运行不正常。
为了避免这种情况发生,可以关闭Nginx的错误和访问记录,也可以单独只关闭访问记录,还可以过滤掉某些不必要记录的访问。

首先是,在虚拟主机配置文件中,可以关闭访问记录:

access_log off;

如果要针对某些后缀的文件,不做访问记录,可以这样配置:

location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$
{
     access_log off;
}

如果需要关闭错误处理,不要这样配置:

error_log off;

这样不会真的关闭记录,nginx会记录到一个叫off的文件里面,起不到任何作用。

需要这样配置:

error_log /dev/null;

如果你只不想关闭记录非常严重的错误,可以这样配置:

error_log /var/log/nginx/error_log crit;

标签:
阅读全文      尚无回复

栏目:源码分析      2,067 views

如果需要对Nginx进行详细调试,就需要查看其Debug信息。而默认情况下这些信息是不记录的,下面的方法告诉你如何查看这些信息。

只调试一个连接,将nginx的配置文件修改成这样:
error_log /var/log/nginx/errors;
events {
    debug_connection   192.168.1.1;
}

设置 error_log,让其输出debug信息

Syntax: error_log file [ debug | info | notice | warn | error | crit ]
Default: ${prefix}/logs/error.log

编译Nginx 的时候用这个选项: –with-debug, 可以看到debug信息,配置输出格式:

error_log LOGFILE [ debug_core | debug_alloc | debug_mutex | debug_event
                    | debug_http | debug_imap];
log_format  access  ‘$remote_addr – $remote_user [$time_local] “$request” ‘
              ‘$status $body_bytes_sent “$http_referer” ‘
              ‘”$http_user_agent” $http_x_forwarded_for’;
access_log  /var/log/nginx/access.log  access;

好,重启nginx,可以访问页面,进行调试了。

标签:
阅读全文      尚无回复

栏目:技巧与优化      4,419 views

Nginx本身不自带PHP处理模块,因此需要配置反向代理,将php请求交给其他的PHP解析器执行,然后返回结果给Nginx。
目前流行的方式是使用fast-cgi的方式配置PHP处理服务。其优点是比较简洁,服务器负载轻。但是缺点也是很明显的:无法查看php处理状态。
比如有时候网站因为负荷过高,php处理线程已经全部阻塞,就会造成网站无法再响应php服务。使用fastcgi方式,无法查看是哪些脚本处理时间过长,阻塞了php处理线程。
而Apache的有点就在于,可以很好的查看哪些php脚本处理时间过长,阻塞了有效进程数。

下面的方式是使用Apache最为Nginx的php处理后台:

1,先安装apache
 apt-get install apache
并配置好apache正确运行在8001端口。

2,修改nginx的虚拟主机配置,其他php脚本交由apache解析

location ~ \.php$ {
    proxy_pass    http://127.0.0.1:8001;
    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_connect_timeout   30;
    proxy_send_timeout      30;
    proxy_read_timeout      30;

    client_max_body_size    10m;
    client_body_buffer_size 128k;
    proxy_buffer_size       4k;
    proxy_buffers           4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
}

重启nginx和apache就好了。

注意,如果要查看php的处理状态,安装使用apache的监控模块就可以了。

标签:
阅读全文      尚无回复

栏目:技巧与优化      3,700 views

fastcgi最大的好处就是效率超高,因为程序一旦载入内存以后,就长期驻留,不会像一般程序那样,每次执行都要重新载入内存。
因为对于大访问量,实际执行操作比较简单的程序,最好编写成fastcgi方式,可以显著提高并发处理能力。

因为nginx不自带fastcgi工具,我们需要lighttpd的spawn-fcgi
老版本的spawn-fcgi在lighttpd中自带,新版本的可以独立安装。老版本系统需要先

apt-get install lighttpd

不让lighttpd运行,或者修改lighttpd默认端口
vi /etc/lighttpd/lighttpd.conf
server.port               = 81

我们需要的是:
/usr/bin/spawn-fcgi

比如我们的fastcgi程序是/home/www/cgi-bin/fast.bin ,他是我们自己用c语言或者其他语言编写并编译好的cgi程序
通过下面命令让他在后台驻留,并绑定在10001端口

spawn-fcgi -a 127.0.0.1 -p 10001 -u freeworm -g freeworm -f /home/www/cgi-bin/fast.bin
编辑虚拟主机,添加

        location /fast.bin {
     fastcgi_pass   127.0.0.1:10001;
            include        /etc/nginx/fastcgi_params;
        }

然后通过这样的链接就可以访问它了:
http://www.nginx.com.cn/fast.bin

标签:
阅读全文      尚无回复

栏目:安装与配置 , 日志分析 , 访问控制      2,383 views

每日网站访问人数多了以后,势必会遇到服务器不稳定现象,比如Web服务器没有响应了。很多时候很难找到原因。这时候监控Nginx服务器的状态变的很重要。
下面告诉你如何可以看到Nginx允许状态页面。

使用–with-http_stub_status_module 选项配置编译Nginx,
然后 加入虚拟主机 下面内容:
 location /nginx_status {
  stub_status on;
  access_log off;
  #allow SOME.IP.ADD.RESS;
  allow all;
  #deny all;
        }

通过下面的链接就可以看到nginx状态了:
http://www.nginx.com.cn/nginx_status

标签:
阅读全文      尚无回复

栏目:安装与配置      4,593 views

rewrite 重写规则可以让网站URL看起来非常简介,对搜索引擎友好,有利于给网站用户带来记忆上的方便,给网站带来更多流量。
因此编写网站rewrite规则很重要。Nginx的rewrite规则非常强大,下面是楼主实际使用过的一些配置最为例子放出来给大家参考。

注意写到location里面,否则$request_filename找不对路径,无效
        location / {
            root   /home/freeworm/www/nginx.com.cn;
            index  index.php index.html index.htm;
            if (!-e $request_filename) {
                rewrite ^/pic/(.*)\.png  siteimage.php?q=$1 last;
                rewrite ^/pic/(.*)  /siteimage.php?q=$1 last;
                rewrite ^/([^/]*)/(.*)$  /main.php?q=$1&force=$2 last;
                rewrite ^/(.*)$  /main.php?q=$1 last;
                rewrite ^/$  /main.php last;
                break;
            }
        }

if (!-f $request_filename) {
 rewrite ^/[^./]*_([0-9]+)\.html$ /index.php?bookid=$1;
 rewrite ^/[^./]*_([0-9]+)$ /index.php?cat=$1;
 rewrite ^/[^./]*tag([0-9]+)$ /index.php?tag=$1;
 rewrite ^/[^./]*-([0-9]+)-([0-9]+)$ /index.php?cat=$1&page=$2;
 rewrite sitemap.xml /sitemap.php;
 break;
}

if (!-f $request_filename) {
 rewrite ^/pxy_(.*) /proxy/index.php?q=$1;
}

 

下面是Discuz论坛的Nginx rewrite规则:
rewrite ^/archiver/((fid|tid)-[\w\-]+\.html)$  archiver/index.php?$1;
rewrite ^/forum-([0-9]+)-([0-9]+)\.html$  forumdisplay.php?fid=$1&page=$2;
rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$  viewthread.php?tid=$1&extra=page\%3D$3&page=$2;
rewrite ^/space-(username|uid)-(.+)\.html$  space.php?$1=$2;
rewrite ^/tag-(.+)\.html$  tag.php?name=$1;

rewrite ^/forum-([0-9]+)-([0-9]+)\.html$ /forumdisplay.php?fid=$1&page=$2 last;

标签:
阅读全文      尚无回复

栏目:安装与配置      8,798 views

与Apache不同,Nginx不自带PHP模块,对于PHP的处理,需要转发给其他有PHP脚本处理能力的系统服务,包括可以的选择有apache,fastcgi等。
如果用Apache作为Nginx处理PHP的后端,可能有点大才效用,配置繁琐,系统资源占用会比较大。对于有洁癖的系统管理员可能更喜欢用fastcgi的方式配置Nginx的php后端。
下面记录了这种方式的配置方法,系统为Debian Linux。

首先安装nginx和php5-cgi,这两个必须的模块。

apt-get -y install nginx
apt-get -y install php5-cgi

vi /etc/php5/cgi/php.ini
#add:
cgi.fix_pathinfo = 1

vi /etc/init.d/php-fastcgi
#paste from init.d/php-fastcgi file
#注意,修改/usr/bin/php-cgi为/usr/bin/php5-cgi,否则加载不了zend
chmod 755 /etc/init.d/php-fastcgi
vi /etc/default/php-fastcgi
#paste from default/php-fastcgi file

重启php5-cgi
/etc/init.d/php-fastcgi stop
cat /var/run/php-fastcgi.pid, 然后杀死这个pid,然后再
/etc/init.d/php-fastcgi start

禁止 php5-cgi开机运行
vi /etc/default/php-fastcgi
START=no

 

/usr/bin/php5-cgi -v
可以看到zend optimizer加载了
#start php-fastcgi:
/etc/init.d/php-fastcgi start
ps ax | grep php 可以看到:
/usr/bin/php5-cgi -q -b localhost:9000

#To have php-fastcgi start at boot time, run
update-rc.d php-fastcgi defaults

#Configuring nginx

nginx上传附件大小限制:
server{中添加body size设置,默认是1M
client_max_body_size 100m;
client_body_timeout 300;
client_header_timeout 60; (这个不用了)

vi /etc/nginx/nginx.conf
设置以下参数
user www-data www-data;
worker_processes  5;
keepalive_timeout  30;
events {
    use epoll;#Linux 下性能最好的 event 模式
    worker_connections  2048;# 每个工作进程允许最大的同时连接数
}
http里面添加:
include /etc/nginx/sites-enabled/*;
把server{}拷贝出来放到虚拟主机目录下面default:

设置虚拟主机目录
mkdir /etc/nginx/sites-enabled/
cd sites-enabled
vi default
拷贝nginx.conf中的虚拟主机server过来
虚拟主机:
index  index.php index.html index.htm;

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
     fastcgi_read_timeout 30;
            #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
     fastcgi_param  SCRIPT_FILENAME  /var/www/nginx-default$fastcgi_script_name;
            include        /etc/nginx/fastcgi_params;
        }

 
注意
$_SERVER["SERVER_NAME"]或getenv(’SERVER_NAME’)获取的始终将是Nginx server_name配置中的第一个域名,这一点在程序开发中需要注意。这第一个域名就相当于Apache虚拟主机配置中的ServerName,后面的域名就相当于Apache的ServerAlias。

vi /etc/nginx/fastcgi_params
添加这一 //暂时去掉,不管用
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
注意:
$document_root变量只有在location中设置了root才管用,否则默认是/usr/local/nginx/html
重启nginx
/etc/init.d/nginx restart

测试php

vi /var/www/nginx-default/info.php
<?php
phpinfo();
?>

标签:
阅读全文      尚无回复

栏目:安装与配置      2,161 views

有时候为了自行安装最新版Nginx,不想系统里面自带的老版本Nginx捣乱,就需要将其删除。
很多时候机房给配置的机器已经自行安装了Nginx,版本又很老,运行起来已经占了80端口,很讨厌。
下面的方法告诉你如何干净的删除Debian Linux系统下自带Nginx。

注意先备份/etc/nginx/nginx.conf等文件
cp /etc/nginx/ ~/ -R

apt-get remove –purge nginx
如果报错,编辑
/var/lib/dpkg/info/nginx.prerm
comment out the line with invoke-rc.d which gives the stop statement for nginx

如果出现无法删除,那么删除:
sudo rm -rf /etc/nginx/
sudo rm -rf /usr/sbin/nginx
sudo rm /usr/share/man/man1/nginx.1.gz
sudo apt-get remove nginx*

标签:
阅读全文      尚无回复

栏目:安装与配置      5,155 views

各大Linux发行版如Redhat,Ubuntu,Debian Linux 都已经自带了Nginx,或者可以通过简单的包管理命令安装,比如 Debian Linux下面
apt-get install nginx

但是Nginx官方更新速度还是很快的,各Linux发行版往往自带的Nginx版本都比较低。相比最新版Nginx,没办法获得更高的性能和更少的bug已经漏洞。
因此,自己能编译官方版最新的Nginx还是很需要的,不光可以享受最新版带来的各种好的特性,还可以自己配置需要的模块和功能。

下面说明如何从源码编译Nginx. 博主的平台是在Debian Linux,其他平台几乎没有多少区别,可以同样对待。

首先,备份老的文件,系统自带的Nginx,以便以后用到。
cp /etc/nginx/ ~/nginx_oldversion_etc -R
cp /usr/sbin/nginx ~/nginx.oldversion

然后开始编译安装最新版Nginx:

1,安装需要的库
apt-get -y install libpcre3 libpcre3-dev libpcrecpp0 libssl-dev zlib1g-dev build-essential

2,下载安装
到这里找最新版: http://nginx.net/
发帖时候最新版是1.3.9,自动Nginx上了1.0之后,版本号上涨速度快了好多啊。

wget http://sysoev.ru/nginx/nginx-1.3.9.tar.gz
tar xvfz nginx-1.3.9.tar.gz
cd nginx-1.3.9

开始配置需要的模块,如果需要得到更多配置,可以用这个命令:
./configure –help

这是博主的配置:
./configure –user=www-data –group=www-data –sbin-path=/usr/local/sbin –with-http_ssl_module –with-http_stub_status_module –with-http_flv_module
开始编译:
make
编译完毕,安装到系统目录 /user/local/bin
make install

启动测试:
/usr/local/sbin/nginx -v
/usr/local/sbin/nginx -t

指定配置文件测试,如用/etc/nginx/nginx.conf测试:
/usr/local/sbin/nginx -t -c /etc/nginx/nginx.conf

参考文献:
http://jimmyg.org/2007/12/07/nginx-proxying-to-pylons-with-ssl-on-debian-etch/
http://wiki.codemongers.com/NginxInstallOptions

标签:
阅读全文      尚无回复