memcache 和 memcached 的区别

1、memcache最早是在2004年2月开发的,最后更新是在2013年4月,而 memcached 最早是在2009年1月开发的,最后更新是在2014年1月更新的。因此 memcache的历史 比 memcached 早。更多信息大家可以参考:

memcache:http://pecl.php.net/package/memcache
memcached:http://pecl.php.net/package/memcached

2、 memcache 是一个原生版本,完全是在 PHP 框架内开发的,支持 OO(面向对象) 和非 OO 两套接口并存,而 memcached 是建立在 libmemcached 的基础上的,只支持 OO 接口。这就意味着在安装 memcache 扩展的时候不要求安装其他的东西,但是在安装 memcached 的时候会要求你安装 libmemcached。别嫌麻烦!因为 libmemcached 是 memcache 的 C 客户端,它具有低内存,线程安全等优点。据说新浪微博之前就全面将 PHP 的 memcache 替换成 PHP 的 memcached,在高并发下,稳定性果断提高。

3.memcached 有个比较 nice 的地方,就是 flag 不是在操作的时候设置的,而是有一个统一的 setOption() 函数进行设置,我们可以举添加缓存数据为例子:

#memcache:
bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] )

#memcached:
public bool Memcached::add ( string $key , mixed $value [, int $expiration ] )

 

从上面各自的 add 方法可以看到,memcache 的 add 方法中的第三个参数代表是否对数据进行压缩,这样假如说我的缓存需要设置过期时间,但是 flag 参数在前面,我就得每一次都对 flag 进行设置!
而 memcached 中是使用 setOption() 来进行统一设置的(默认开启压缩)。

4、memcached 比 memcache 支持更多的 memcache 协议,大概也就是说 memcached 有更多的方法,比如 getMulti() 和 setMulti() 函数非常有用,但是 memcache 并不支持。

5、差别比较大的一点是,memcached 支持 Binary Protocol,而 memcache 不支持,这意味着 memcached 会有更高的性能。但是网上很多博客说 memcached 不支持长连接,这其实不然。

6、比较尴尬的一点是 memcached 和 memcache 对应的服务端名字都是 memcached,大家使用 ps aux | grep memcache 就会发现守护进程的名字是 memcached(我的环境是 ubuntu),其实后面的 d 可以理解为守护进程,因此网上有的人说 memcache 是客户端, memcached 是服务端就是这个意思,同学们不要将客户端的 memcached 和服务端的 memcached 混淆了就好。

7、两者在实现某些相同功能时所使用的算法也是有一定差异的,由于内容比较深,我也不太懂。。。。。

总结

1、本篇博客参考了很多网上的资料,加上自己的理解总结出来的。

2、从上面的分析也可以得出一个结论:memcached 比 memcache 好,因此在以后的开发过程中,大家尽量使用 memcached。

转自:https://blog.csdn.net/baidu_30000217/article/details/53586536

 

MySQL中有关TIMESTAMP和DATETIME的总结

一、MySQL中如何表示当前时间?

其实,表达方式还是蛮多的,汇总如下:

CURRENT_TIMESTAMP
CURRENT_TIMESTAMP()
NOW()
LOCALTIME
LOCALTIME()
LOCALTIMESTAMP
LOCALTIMESTAMP()

 

二、关于TIMESTAMP和DATETIME的比较

TIMESTAMP和DATETIME的相同点:

1> 两者都可用来表示YYYY-MM-DD HH:MM:SS[.fraction]类型的日期。

TIMESTAMP和DATETIME的不同点:

1> 两者的存储方式不一样

对于TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。

而对于DATETIME,不做任何改变,基本上是原样输入和输出。

下面,我们来验证一下:

首先创建两种测试表,一个使用timestamp格式,一个使用datetime格式。

 

mysql> create table test(id int,hiredate timestamp);

Query OK, 0 rows affected (0.01 sec)


mysql> insert into test values(1,'20151208000000');

Query OK, 1 row affected (0.00 sec)

mysql> create table test1(id int,hiredate datetime);

Query OK, 0 rows affected (0.01 sec)

mysql> insert into test1 values(1,'20151208000000');

Query OK, 1 row affected (0.00 sec)

mysql> select * from test;

+------+---------------------+

| id | hiredate |

+------+---------------------+

| 1 | 2015-12-08 00:00:00 |

+------+---------------------+

1 row in set (0.01 sec)


mysql> select * from test1;

+------+---------------------+

| id | hiredate |

+------+---------------------+

| 1 | 2015-12-08 00:00:00 |

+------+---------------------+

1 row in set (0.00 sec)

两者输出是一样的。

其次修改当前会话的时区

mysql> show variables like '%time_zone%';

+------------------+--------+

| Variable_name | Value |

+------------------+--------+

| system_time_zone | CST |

| time_zone | SYSTEM |

+------------------+--------+

2 rows in set (0.00 sec)


mysql> set time_zone='+0:00';

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test;

+------+---------------------+

| id | hiredate |

+------+---------------------+

| 1 | 2015-12-07 16:00:00 |

+------+---------------------+

1 row in set (0.00 sec)


mysql> select * from test1;

+------+---------------------+

| id | hiredate |

+------+---------------------+

| 1 | 2015-12-08 00:00:00 |

+------+---------------------+

1 row in set (0.01 sec)

上述“CST”指的是MySQL所在主机的系统时间,是中国标准时间的缩写,China Standard Time UT+8:00

通过结果可以看出,test中返回的时间提前了8个小时,而test1中时间则不变。这充分验证了两者的区别。

2> 两者所能存储的时间范围不一样

timestamp所能存储的时间范围为:'1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999'。

datetime所能存储的时间范围为:'1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。
总结:TIMESTAMP和DATETIME除了存储范围和存储方式不一样,没有太大区别。当然,对于跨时区的业务,TIMESTAMP更为合适。

三、关于TIMESTAMP和DATETIME的自动初始化和更新

首先,我们先看一下下面的操作

mysql> create table test(id int,hiredate timestamp);

Query OK, 0 rows affected (0.01 sec)




mysql> insert into test(id) values(1);

Query OK, 1 row affected (0.00 sec)




mysql> select * from test;

+------+---------------------+

| id | hiredate |

+------+---------------------+

| 1 | 2015-12-08 14:34:46 |

+------+---------------------+

1 row in set (0.00 sec)




mysql> show create table test\G

*************************** 1. row ***************************

Table: test

Create Table: CREATE TABLE `test` (

`id` int(11) DEFAULT NULL,

`hiredate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

) ENGINE=InnoDB DEFAULT CHARSET=latin1

1 row in set (0.00 sec)

看起来是不是有点奇怪,我并没有对hiredate字段进行插入操作,它的值自动修改为当前值,而且在创建表的时候,我也并没有定义“show create table test\G”结果中显示的“ DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP”。

其实,这个特性是自动初始化和自动更新(Automatic Initialization and Updating)。

自动初始化指的是如果对该字段(譬如上例中的hiredate字段)没有显性赋值,则自动设置为当前系统时间。

自动更新指的是如果修改了其它字段,则该字段的值将自动更新为当前系统时间。

它与“explicit_defaults_for_timestamp”参数有关。

 

默认情况下,该参数的值为OFF[设为off将自动更新时间],如下所示:

mysql> show variables like '%explicit_defaults_for_timestamp%';

+---------------------------------+-------+

| Variable_name | Value |

+---------------------------------+-------+

| explicit_defaults_for_timestamp | OFF |

+---------------------------------+-------+

1 row in set (0.00 sec)

下面我们看看官档的说明:

By default, the first TIMESTAMP column has both DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP if neither is specified explicitly。

很多时候,这并不是我们想要的,如何禁用呢?

1. 将“explicit_defaults_for_timestamp”的值设置为ON。

2. “explicit_defaults_for_timestamp”的值依旧是OFF,也有两种方法可以禁用

1> 用DEFAULT子句该该列指定一个默认值

2> 为该列指定NULL属性。

如下所示:

mysql> create table test1(id int,hiredate timestamp null);

Query OK, 0 rows affected (0.01 sec)




mysql> show create table test1\G

*************************** 1. row ***************************

Table: test1

Create Table: CREATE TABLE `test1` (

`id` int(11) DEFAULT NULL,

`hiredate` timestamp NULL DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=latin1

1 row in set (0.00 sec)




mysql> create table test2(id int,hiredate timestamp default 0);

Query OK, 0 rows affected (0.01 sec)




mysql> show create table test2\G

*************************** 1. row ***************************

Table: test2

Create Table: CREATE TABLE `test2` (

`id` int(11) DEFAULT NULL,

`hiredate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'

) ENGINE=InnoDB DEFAULT CHARSET=latin1

1 row in set (0.00 sec)

在MySQL 5.6.5版本之前,Automatic Initialization and Updating只适用于TIMESTAMP,而且一张表中,最多允许一个TIMESTAMP字段采用该特性。从MySQL 5.6.5开始,Automatic Initialization and Updating同时适用于TIMESTAMP和DATETIME,且不限制数量。

XDebug安装配置教程

XDebug是一个开放源代码的PHP程序调试性能分析器(即一个Debug工具),可以用来跟踪,调试分析PHP程序的运行状况。相比echoprint_r()var_dump()printf()函数,使用XDebug的效率和精准度更高、也更快捷。

1 安装

XDebug官网下载地址:https://xdebug.org/download.php

1.1 Windows服务器

到XDebug官网下载DLL文件,并将DLL文件放到PHP的ext目录下。

下载的dll文件必须与PHP的版本一致,通过phpinfo()查看当前PHP的版本号、架构位数、VC版本以及是否为安全线程。

例如,我本地的phpinfo()输出与以上相关的信息为:

  • PHP Version7.1.0
  • Architecturex64
  • Zend Extension BuildAPI320160303,NTS,VC14

所以我要下载的XDebug扩展文件为:PHP 7.1 VC14 (64 bit)

因为扩展名没有TS,是非线程安全,即NTS,与PHP的API320160303,NTS,VC14信息对应。

然后修改php.ini文件,在后面加上:

[XDebug]
zend_extension = "D:\php\php54n\ext\php_xdebug-2.5.0-7.1-vc14-nts-x86_64.dll"

1.2 Linux服务器

首先,到XDebug官网下载源码,然后用命令安装。

$ wget https://xdebug.org/files/xdebug-2.4.0.tgz
$ phpize
$ ./configure
$ make
$ sudo make install

64位Linux系统会将 xdebug.so 文件安装到  /usr/lib64/php/modules/ 目录下。

修改php.ini文件,加上如下两行。

[XDebug]
zend_extension = /usr/lib64/php/modules/xdebug.so

也可以在/etc/php.d/下新建xdebug.ini文件,内容一样,PHP会自动加载该目录下的文件。

2 配置

接着,打开php.ini,在[XDebug]部分下面继续添加如下# Debug Config和# Profiler Config后的配置,如下:

[XDebug]
zend_extension = /usr/lib64/php/modules/xdebug.so

; Debug Config
xdebug.remote_enable = 1
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "127.0.0.1"
xdebug.remote_port = 9000
xdebug.remote_log = "/var/log/php-fpm/xdebug.log"

; Profiler Config
xdebug.profiler_enable = 1
xdebug.profiler_enable_trigger = 1
xdebug.profiler_output_dir = "/tmp/xdebug"
xdebug.profiler_output_name = "out.%t-%s"

如果只是用于调试,那么只要加#Debug Config和后面的几行。如果调试客户端(如:PHPStorm IDE)和PHP不在同一电脑上,则需要把xdebug.remote_host配置成调试客户端的IP。

如果要PHP程序性能分析,则再加上# Profiler Config以及后面的配置。

查看XDebug的所有配置

3 编辑器配置

参考:http://www.awaimai.com/1290.html

PhpStorm配置XDebug调试PHP

1 PHP配置

首先需要配置PHP,请参考《XDebug安装配置教程》。

2 配置 XDebug

路径:File > Settings > Languages & Frameworks > PHP > Debug

phpstrom-debug-02.png

3 配置 Server

路径:File SettingsLanguages & Frameworks PHPServers

phpstrom-debug-01.png

其中,Host 是调试时浏览器访问的域名。

注意:如果所谓的“远程服务器”就在本地的话,就不需要勾选“Use path mappings(select if the servers is remote or symlinks are used)

4 设置调试项

选择菜单 Run Edit Configurations,弹出“Run/Debug Configrations”对话框:

phpstrom-debug-03.png

phpstrom-debug-04.png

5 开始调试页面

Shift + F9,或菜单选择 Run > Debug 调试名称,开启调试。

phpstrom-debug-06.png

特别说明下:

如果选择了 Run > Start Listening for PHP Debug connections,则PHPStorm会监听浏览器,如果浏览器访问第4步的”Start Url“,那么PHPStorm会自动跳转到断点处。点击调试按钮,一步一步调试吧!

常用的几个快捷键:

  • F7:步入
  • F8:跳过
  • Shift + F8:步出
  • Alt + F9:调到光标处

所有快捷键最好从 Run 菜单下查看。

 

参考资料:

  1. http://www.awaimai.com/1029.html
  2. 【总结1】PhpStorm配置XDebug(远程)调试PHP

Nginx负载均衡配置

负载均衡,将用户的所有HTTP请求均衡的分配到每一台机器上,充分发挥所有机器的性能,提高服务的质量和用户体验。负载均衡可以通过负载均衡网络硬件设备和Web服务器软件来实现,前者设备成本较高,小公司通常负担不起,所以后者一般是我们的首选。实现负载均衡常用的Web服务器软件有Nginx、HAProxy、LVS、Apache,本文主要介绍Nginx的负载均衡策略:

一、内置负载策略

Nginx负载均衡是通过upstream模块来实现的,内置实现了三种负载策略,配置还是比较简单的。官网负载均衡配置说明:http://nginx.org/en/docs/http/load_balancing.html

  • 1.轮循(默认) 
    
    Nginx根据请求次数,将每个请求均匀分配到每台服务器
  • 2.最少连接 
    
    将请求分配给连接数最少的服务器。Nginx会统计哪些服务器的连接数最少。
  • 3.IP Hash 
    
    绑定处理请求的服务器。第一次请求时,根据该客户端的IP算出一个HASH值,将请求分配到集群中的某一台服务器上。后面该客户端的所有请求,都将通过HASH算法,找到之前处理这台客户端请求的服务器,然后将请求交给它来处理。

1> 轮循

http { 
# ... 省略其它配置 
upstream backserver { 
    server 192.168.0.100:8080; 
    server 192.168.0.101:8080; 
    server example.com:8080; 
} 
server { 
    listen 80; 
    location / { 
       proxy_pass http://tomcats; 
    } 
} 
# ... 省略其它配置 
}
  • proxy_pass http://tomcats:表示将所有请求转发到tomcats服务器组中配置的某一台服务器上。
  • upstream模块:配置反向代理服务器组,Nginx会根据配置,将请求分发给组里的某一台服务器。tomcats是服务器组的名称。
  • upstream模块下的server指令:配置处理请求的服务器IP或域名,端口可选,不配置默认使用80端口。通过上面的配置,Nginx默认将请求依次分配给100,101,102来处理,可以通过修改下面这些参数来改变默认的分配策略:
    • weight
      默认为1,将请求平均分配给每台server

      upstream backserver {
          server 192.168.0.100:8080 weight=2;  # 2/6次
          server 192.168.0.101:8080 weight=3;  # 3/6次
          server 192.168.0.102:8080 weight=1;  # 1/6次
      }

      上例配置,表示6次请求中,100分配2次,101分配3次,102分配1次

    • max_fails
      默认为1。某台Server允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器。如果设置为0,Nginx会将这台Server置为永久无效状态,然后将请求发给定义了proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream指令来处理这次错误的请求。
    • fail_timeout
      默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它

      upstream backserver {
          server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
          server 192.168.0.101:8080 weight=3;
          server 192.168.0.102:8080 weight=1;
      }

      192.168.0.100这台机器,如果有3次请求失败,nginx在15秒内,不会将新的请求分配给它。

    • backup
      备份机,所有服务器挂了之后才会生效

      upstream backserver {
          server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
          server 192.168.0.101:8080 weight=3;
      
          server 192.168.0.102:8080 backup;
      }

      在100和101都挂了之前,102为不可用状态,不会将请求分配给它。只有当100和101都挂了,102才会被启用。

    • down
      标识某一台server不可用。可能能通过某些参数动态的激活它吧,要不真没啥用。

      upstream backserver {
          server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
      
          server 192.168.0.101:8080 down;
      
          server 192.168.0.102:8080 backup;
      }

      表示101这台Server为无效状态,不会将请求分配给它。

    • max_conns
      限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制。注意:1.5.9之后的版本才有这个配置

      upstream tomcats {
          server 192.168.0.100:8080 max_conns=1000;
      }

      表示最多给100这台Server分配1000个请求,如果这台Server正在处理1000个请求,nginx将不会分配新的请求给到它。假如有一个请求处理完了,还剩下999个请求在处理,这时nginx也会将新的请求分配给它。

    • resolve
      将server指令配置的域名,指定域名解析服务器。需要在http模块下配置resolver指令,指定域名解析服务

      http {
          resolver 10.0.0.1;
      
          upstream u {
              zone ...;
              ...
              server example.com resolve;
          }
      }

      表示example.com域名,由10.0.0.1服务器来负责解析。
      upstream模块server指令的其它参数和详细配置说明,请参考官方文档

      2> IP Hash

      每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

    • upstream backserver { 
      
      ip_hash; 
      
      server 192.168.0.14:88; 
      
      server 192.168.0.15:80; 
      
      }

二、第三方负载策略

1> fair

根据服务器的响应时间来分配请求,响应时间短的优先分配,即负载压力小的优先会分配。

由于fair模块是第三方提供的,所以在编译nginx源码的时候,需要将fair添加到nginx模块中。

假设我的nginx是通过源码安装的,安装在/opt/nginx目录下,而且安装时没有添加fair模块

1> 下载fair模块源码
下载地址:https://github.com/xyang0917/nginx-upstream-fair

cd /opt
wget https://github.com/xyang0917/nginx-upstream-fair/archive/master.zip
unzip master.zip

解压后的目录名为:nginx-upstream-fair-master

2> 重新编译nginx,将fair模块添加到编译参数
我的nginx源码目录在/opt/nginx-1.10.0

cd /opt/nginx-nginx-1.10.0
./configure --prefix=/opt/nginx --add-module=/opt/nginx-upstream-fair-master
make

注意:不要执行make install,这样会覆盖之前nginx的配置
3> 将新编译的nginx可执行程序拷贝到/opt/nginx/sbin/目录下,覆盖之前安装的nginx
编译后的nginx执行程序,放在nginx源码的objs目录下

ps -aux | grep nginx
kill -9 nginx进程ID  # 停止nginx服务
cp /opt/nginx-1.10.0/objs/nginx /opt/nginx/sbin/  # 覆盖旧的nginx
nginx # 启动服务

配置使用fair负载策略模块:

upstream backserver {
    fair;
    server 192.168.0.100:8080;
    server 192.168.0.101:8080;
    server 192.168.0.102:8080;
}

由于采用fair负载策略,配置weigth参数改变负载权重将无效。

2> url_hash

按请求url的hash结果来分配请求,使每个url定向到同一个后端服务器,服务器做缓存时比较有效。

1.7.2版本以后,url_hash模块已经集成到了nginx源码当中,不需要单独安装。之前的版本仍需要单独安装,下载地址:https://github.com/evanmiller/nginx_upstream_hash
安装方法和fair模块一样,先下载url_hash源码,然后重新编译nginx源码,将url_hash模块添加到编译配置参数当中,最后将编译后生成的nginx二进制文件替换之前安装的nginx二进制文件即可。

upstream backserver { 
    server 192.168.0.100:8080; 
    server 192.168.0.101:8080; 
    server 192.168.0.102:8080; 
    hash $request_uri; 
}

Nginx配置文件nginx.conf中文详解

PS:Nginx使用有三四年了,抽点时间总结一下:

#定义Nginx运行的用户和用户组
user www www;

#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;

#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;

#进程文件
pid /var/run/nginx.pid;

#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;

#工作模式与连接数上限
events
{
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535;
}

#设定http服务器
http
{
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型
#charset utf-8; #默认编码
server_names_hash_bucket_size 128; #服务器名字的hash表大小
client_header_buffer_size 32k; #上传文件大小限制
large_client_header_buffers 4 64k; #设定请求缓
client_max_body_size 8m; #设定请求缓
sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on; #防止网络阻塞
tcp_nodelay on; #防止网络阻塞
keepalive_timeout 120; #长连接超时时间,单位是秒

#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;

#gzip模块设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级
gzip_types text/plain application/x-javascript text/css application/xml;
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

upstream blog.ha97.com {
#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
}

#虚拟主机的配置
server
{
#监听端口
listen 80;
#域名可以有多个,用空格隔开
server_name www.ha97.com ha97.com;
index index.html index.htm index.php;
root /data/www/ha97;
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
#图片缓存时间设置
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS缓存时间设置
location ~ .*\.(js|css)?$
{
expires 1h;
}
#日志格式设定
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/ha97access.log access;

#对 "/" 启用反向代理
location / {
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可选。
proxy_set_header Host $host;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
}

#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
}

#本地动静分离反向代理配置
#所有jsp的页面均交由tomcat或resin处理
location ~ .(jsp|jspx|do)?$ {
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_pass http://127.0.0.1:8080;
}
#所有静态文件由nginx直接读取不经过tomcat或resin
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{ expires 15d; }
location ~ .*.(js|css)?$
{ expires 1h; }
}
}