显示标签为“Nginx”的博文。显示所有博文
显示标签为“Nginx”的博文。显示所有博文

2014年5月26日星期一

nginx auth basic 认证

有时候需要象Apache那样为指定的目录添加访问验证,一般在Apache下使用htpasswd来添加,而htpasswd是包含在apache2-utils


以一个简单的后台管理为例, 地址:http://xxxx/admin/*, 对admin 下面的文件进行权限管理
1. 使用命令生成passfile 文件: htpasswd -c -d /etc/nginx/pass_file  username
2. 修改ngnix 配置
location ~ /admin {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/pass_file; //请使用绝对路径
        root   /home/www/admin; //host 地址,不然认证通过之后,找不到对应的文件
}  

htpasswd命令

apache htpasswd 命令选项参数说明

  -c 创建一个加密文件

  -n 不更新加密文件,只将apache htpasswd命令加密后的用户名密码显示在屏幕上

  -m 默认apache htpassswd命令采用MD5算法对密码进行加密

  -d apache htpassswd命令采用CRYPT算法对密码进行加密

  -p apache htpassswd命令不对密码进行进行加密,即明文密码

  -s apache htpassswd命令采用SHA算法对密码进行加密

  -b 在apache htpassswd命令行中一并输入用户名和密码而不是根据提示输入密码
  -D 删除指定的用户


apache htpasswd命令用法实例

1、利用htpasswd命令添加用户

  htpasswd -bc passwd_filename username 123456

2、在原有密码文件中增加下一个用户

  htpasswd -b passwd_filename username 123456

3、如何不更新密码文件,只显示加密后的用户名和密码

  htpasswd -nb username 123456

4、利用htpasswd命令删除用户名和密码

  htpasswd -D passwd_filename username

5、利用htpasswd命令修改密码

  htpasswd -D passwd_filename username

  htpasswd -b passwd_filename username 5678

2013年10月4日星期五

Tengine

Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。


从2011年12月开始,Tengine成为一个开源项目,Tengine团队在积极地开发和维护着它。Tengine团队的核心成员来自于淘宝搜狗等互联网企业。


土豆网 采用的是 Tengine



下面摘自taobao的Tengine主页的特性

2013年7月24日星期三

ubuntu passenger安装问题 与 nginx配置passenger

http://chinacheng.iteye.com/blog/1891003


Passenger有一个专门安装nginx的模块,安装起来非常方便 

安装的时候一个问题提示缺少 
引用
* Checking for Curl development headers with SSL support...
      Found: no
      Error: Cannot find the `curl-config` command.


解决办法 
Java代码  收藏代码
  1. sudo apt-get install libcurl3-dev  


配置用户权限 
引用

创建用户adduser www
nginx配置文件里设置user www
设置web 网站的文件夹(mysite)权限
chown www -R mysite

如果你之前用chmod 777修改过mysite,需要
chmod -R 755 mysite
find mysite -type f -exec chmod 644 {} \;
确保文件夹是755, 文件是644权限。


nginx部分配置文件 
Java代码  收藏代码
  1. user  www;  
  2. worker_processes  1;  
  3.   
  4. ......  
  5.   
  6. http {  
  7.     passenger_root /usr/local/rvm/gems/ruby-2.0.0-p195/gems/passenger-4.0.5;  
  8.     passenger_ruby /usr/local/rvm/wrappers/ruby-2.0.0-p195/ruby;  
  9.   
  10.     include       mime.types;  
  11.     default_type  application/octet-stream;  
  12.   
  13.     #access_log  logs/access.log  main;  
  14.   
  15.     sendfile        on;  
  16.     #tcp_nopush     on;  
  17.   
  18.     #keepalive_timeout  0;  
  19.     keepalive_timeout  65;  
  20.   
  21.     #gzip  on;  
  22.   
  23.     server {  
  24.         listen       8080;  
  25.         server_name  localhost;  
  26.   
  27.         #charset koi8-r;  
  28.   
  29.         #access_log  logs/host.access.log  main;  
  30.   
  31.         location / {  
  32.             root   /home/redmine-2.3/public;  
  33.             index  index.html index.htm;  
  34.             passenger_enabled on;  
  35.         }  
  36.   
  37.         #error_page  404              /404.html;  
  38.   
  39.         # redirect server error pages to the static page /50x.html  
  40.         #  
  41.         error_page   500 502 503 504  /50x.html;  
  42.         location = /50x.html {  
  43.             root   html;  
  44.         }  
  45.   
  46.         
  47.     }  
  48.   
  49.   
  50. }  

2013年7月12日星期五

nginx、php-fpm 用户配置

核心总结:php-fpm 子进程所使用的用户,不能是网站文件所有者。 凡是违背这个原则,则不符合最小权限原则。
根据生产环境不断反馈,发现不断有 php网站被挂木马,绝大部分原因是因为权限设置不合理造成。因为服务器软件,或是 php 程序中存在漏洞都是难免的,在这种情况下,如果能正确设置 Linux 网站目录权限, php 进程权限,那么网站的安全性实际上是可以得到保障的。
那么,造成网站被挂木马的原因是什么?
1.  ftp 连接信息被破解,对这个原因,可行的办法就是使用非常复杂的FTP 用户名(不要使用常用的用户名),如果是固定作业,可考虑使用 iptables 防火墙限制来源 IP 。但是一些情景下,可能需要使用 VPN 以便远程维护。 即网站维护者需要使用 FTP 修改网站文件时,必须先登录到 IDC 机房的 VPN 服务器上,再进行后续的操作。
2.  网站服务器软件/ 配置 /php 程序存在漏洞,被利用
在讨论这个问题前,先说明文件及进程权限的几个概念:
A. FTP用户对网站目录具有最大修改权限,那么网站的文件所有者一定属于 FTP,  这是毋庸置疑的 , 否则如何修改文件呢?
B. php-fpm进程, nginx 进程对网站文件至少需要有读取权限,例如,以下命令即可查看这两个进程所使用的账号:


通过上图,我们可以发现,nginx 和 php-fpm 子进程账号是 nobody 。
我们再查看网站文件目录的权限:

发现网站文件所有者是www 账号,那说明:
| nginx和 php 对网站只有读取权限,无写入权限
l 如果php 程序需要对网站某些文件有写入权限,需要手工将文件或目录权限修改为 777
l 因为php-fpm 子进程是以 nobody 运行,那么 php-fpm 生成的新文件所有者也是 nobody, 这时 ftp 用户将无法修改这些文件,解铃还需系铃人,当 php 生成文件后,需要调用 chmod("/somedir/somefile", 0777) 将文件权限修改为 777 ,以便 FTP 用户也可以修改这个文件。
l 经常有开发人员找我请求重设php 生成的文件的权限。
l 如果php-fpm 子进程以网站文件所有者用户运行,那意味着 php-fpm 进程对整个网站目录具有可写权限,噩梦也就由此开始。
但是我们发现,有不少系统管理员为了省事,违背了Linux 最小化权限的原则,设置 php-fpm 进程以网站文件所有者账号运行,当然这样可能会方便 php 开发人员( php-fpm 进程对整个网站目录具有可写权限),但是这样一来, Linux 体系的文件系统权限原则将被打破,所有的安全措施将形同虚设。可以想象的是,万一 php 程序中有漏洞,攻击者上传木马,便可以修改网站的所有文件,网站首页被黑,也就不足为怪了。
退一步,如果我们设置了较严格的权限,就算php 程序中存在漏洞,那么攻击者也只能篡改权限为 777 的目录,其它的文件是无法被改写的,网站不就就得更安全了吗?
核心总结:php-fpm 子进程所使用的用户,不能是网站文件所有者。 凡是违背这个原则,则不符合最小权限原则。
经过我参阅网上关于nginx, php-fpm 配置的文章教程和市面上的一些书籍,发现有不少人受这些文章的误导,直接让 php-fpm 子进程以网站所有者账号运行,例如张宴的《实战 nginx 取代 apache 的高性能 Web 服务器》一书的 52 页中,存在以下设置:
www
www
而在第50 页,设置网站文件所有者也为 www 用户:
chown -R www:www /data0/htdocs/blog
显然,此书的这部分内部,对初学者有误导,针对这个问题,我已经向本书作者发邮件,希望其能在第二版中进行强调声明,以免由于过度宽松的权限配置,造成一些安全隐患。
官方提供的配置文件中,php-fpm 子进程使用 nobody 用户,这完全是合理的,无须修改。
那么nginx 的子进程用户,如何设置合理? 我的建议是也使用 nobody (对错误日志写入等无影响),设置方法如下:
nginx.conf文件第一行设置为 user nobody; , 再执行 nginx -s reload 即可。
php-fpm子进程用户设置方法:
编辑文件php-fpm.conf (一般位于 /usr/local/php/etc/php-fpm.conf, 视安装参数为准),找到 user 、 group 两个参数的定义,将其设置为nobody( 默认已经是 nobody) ,再重启 php-fpm 进程即可。
网站可写目录的特殊注意
这里的可写,是相对php-fpm 子进程而言。一个网站最容易出安全问题的即是可写目录,如果可写目录权限能控制严格,安全系数也将大大提高。
我们认为,一个网站可写目录主要分为以下几种:
1.  php 数据缓存目录,如 discuz 的 forumdata 目录,就存放了大量数据缓存文件。此类目录一般会禁止用户直接访问,但是 discuz 在这个目录下又存放了不少 js, css 文件,我们并不能简单地拒绝用户访问这个目录。显然,这个目录下的所有文件,不能直接交给 php 解析,我们后面会给出解决方案。
2.  附件上传目录。显然此类目录需要开启访问,但不能交由php 引擎解析(即这个目录下的所有文件均视为普通静态文件)。
3.  静态文件生成目录,这类目录下的文件全部应视为静态文件。
4.  日志目录, 一般都会拒绝用户直接访问之。
也就是说对网站开发人员而言,需要对可写目录实现动静分离,不同性能的文件,应该区别对待之,这样也就方便系统管理员,设置合理的nginx 规则,以提高安全性。
简单地去掉php 文件的执行权限,并不能阻止 php-fpm 进程解析之。
接下来,根据以上总结,系统管理员如何配置nginx 的目录规则,才更安全呢?
1.  数据缓存目录 /cache/
这个目录的特点是需要777 权限,无须提供给用户访问,那么可以按以下参考配置 nginx
location ~ "^/cache" {
return 403;
}
location ~ ".php$" {
fastcgi_pass 127.0.0.0:9000;
....................
}
这时,任何用户将无法访问/cache/ 目录内容,即使
2. 附件上传目录 attachments
此目录的特点是需要开放访问权限,但所有文件不能由php 引擎解析(包括后缀名改为 gif 的木马文件)
location ~ "^/attachments" {
}
location ~ ".php$" {
fastcgi_pass 127.0.0.0:9000;
....................
}
注意,上面对attachments 目录的 location 定义中是没有任何语句的。 nginx 对正则表达式的 location 匹配优先级最高,任何一个用正则表达式定义的 location, 只要匹配一次,将不会再匹配其它正则表达式定义的 location 。
现在,请在attachments 目录下建立一个 php 脚本文件,再通过浏览器访问安,我们发现浏览器提示下载,这说明 nginx 把 attachments 目录下的文件当成静态文件处理,并没有交给 php fastcgi 处理。这样即使可写目录被植入木马,但因为其无法被执行,网站也就更安全了。
显然,重要的php 配置文件,请勿放在此类目录下。
3.  静态文件生成目录 public
这些目录一般都是php 生成的静态页的保存目录,显然与附件目录有类似之处,按附件目录的权限设置即可。
可以预见的是,如果我们设置了较严格的权限,即使网站php 程序存在漏洞,木马脚本也只能被写入到权限为 777 的目录中去,如果配合上述严格的目录权限控制,木马也无法被触发运行,整个系统的安全性显然会有显著的提高。
但是网站可写目录的作用及权限,只有开发人员最为清楚。这方面需要php 开发人员和系统管理员积极沟通。我们使用的方式是:项目上线前,开发人员根据以文档形式提供网站可写目录的作用及权限,由系统管理员针对不同目录进行权限设置。任何一方修改了网站目录权限,但未体现到文档中,我们认为是违反工作流程的。






2013年7月9日星期二

nginx配置$document_root

nginx配置php老是出错,最后才发现是$document_root的设置问题。
 
            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;
        }
 
这个用出现找不到php的错误。因为$document_root 的参数是由root html那一行定义的,默认是在/usr/local/Cellar/nginx/html/ 所以把 html换成站点根目录就正常了。
 
            location ~ \.php$ {
            root           /usr/share/nginx/html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

2013年7月8日星期一

实战Nginx与PHP(FastCGI)的安装、配置与优化


FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同时,FastCGI也被许多脚本语言所支持,其中就有PHP。
FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。另外传统的CGI接口方式安全性也很差,现在已经很少被使用了。
FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。
二、Nginx+FastCGI运行原理
Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。详细的过程,如图1所示。
图1 Nginx+FastCGI运行原理
三、spawn-fcgi与PHP-FPM
前面介绍过,FastCGI接口方式在脚本解析服务器上启动一个或者多个守护进程对动态脚本进行解析,这些进程就是FastCGI进程管理器,或者称之为FastCGI引擎, spawn-fcgi与PHP-FPM就是支持PHP的两个FastCGI进程管理器。下面简单介绍spawn-fcgi与PHP-FPM的异同。
spawn-fcgi是HTTP服务器lighttpd的一部分,目前已经独立成为一个项目,一般与lighttpd配合使用来支持PHP,但是ligttpd的spwan-fcgi在高并发访问的时候,会出现内存泄漏甚至自动重启FastCGI的问题。
Nginx是个轻量级的HTTP server,必须借助第三方的FastCGI处理器才可以对PHP进行解析,因此Nginx+spawn-fcgi的组合也可以实现对PHP的解析,这里不过多讲述。
PHP-FPM也是一个第三方的FastCGI进程管理器,它是作为PHP的一个补丁来开发的,在安装的时候也需要和PHP源码一起编译,也就是说PHP-FPM被编译到PHP内核中,因此在处理性能方面更加优秀;同时它在处理高并发方面也比spawn-fcgi引擎好很多,因此,推荐Nginx+PHP/PHP-FPM这个组合对PHP进行解析。
FastCGI 的主要优点是把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求。


什么是PHP-FPM 
PHP-FPM是PHP FastCGI Process Manager的缩写,即PHP FastCGI进程管理器
PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在 http://php-fpm.org/download下载得到.
PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。
新版PHP已经集成php-fpm了,不再是第三方的包了,推荐使用。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多有点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM,其它参数都是配置php的,具体选项含义可以查看这里

四、 PHP与PHP-FPM的安装及优化
1. 下载安装包
从php官方网站下载PHP源码包,这里下载的是稳定版php-5.2.13.tar.gz。从这里下载对应的PHP-FPM源码包,这里下载的是php-5.2.13-fpm-0.5.13.diff.gz。需要注意,在下载软件包版本时,尽量使PHP和PHP-FPM版本一致,如果版本之间相差太大,可以会出现兼容问题。
2. 配置安装环境
安装PHP需要下面软件包的支持,如果没有安装,请自行安装。
yum -y install gcc gcc-c++ libxml2 libxml2-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel
由于各个Linux系统版本的不确定性,读者也可以在安装PHP过程中,根据错误提示信息,安装对应的软件库。
3. 开始编译安装PHP和PHP-FPM
编译安装PHP和PHP-FPM很简单,下面是安装过程:
tar zxvf php-5.2.13.tar.gz
gzip -cd php-5.2.13-fpm-0.5.13.diff.gz | patch -d php-5.2.13 -p1
cd php-5.2.13
./configure --prefix=/usr/local/php --enable-fastcgi --enable-fpm
make
make install
cp php.ini-dist /usr/local/php/lib/php.ini
其中,第二步将PHP-FPM作为补丁加入PHP源码中。 在“./configure”编译选项中,指定将PHP安装到/usr/local下,“--enable-fastcgi”是启用对PHP的FastCGI支持,“--enable-fpm”是激活对FastCGI模式的fpm支持。 在编译PHP时可以加入很多编译选项,但是这里为了介绍PHP的FastCGI功能没有加入更多的编译选项。
4. 配置与优化
PHP-FPM PHP的全局配置文件是php.ini,在上面的步骤中,已经将此文件复制到了/usr/local/php/lib/php.ini下。可以根据每个应用需求的不同,对php.ini进行相应的配置。 下面重点介绍PHP-FPM引擎的配置文件。根据上面指定的安装路径,PHP-FPM的默认配置文件为/usr/local/php/etc/php-fpm.conf。 php-fpm.conf是一个XML格式的纯文本文件,其内容很容易看明白。
这里重点介绍几个重要的配置标签:
标签listen_address是配置fastcgi进程监听的IP地址以及端口,默认是127.0.0.1:9000。
127.0.0.1:9000
标签display_errors用来设置是否显示PHP错误信息,默认是0,不显示错误信息,设置为1可以显示PHP错误信息。
0
标签user和group用于设置运行FastCGI进程的用户和用户组。需要注意的是,这里指定的用户和用户组要和Nginx配置文件中指定的用户和用户组一致。
nobody < value name="group">nobody
标签max_children用于设置FastCGI的进程数。根据官方建议,小于2GB内存的服务器,可以只开启64个进程,4GB以上内存的服务器可以开启200个进程。
5
标签request_terminate_timeout用于设置FastCGI执行脚本的时间。默认是0s,也就是无限执行下去,可以根据情况对其进行修改。
0s
标签rlimit_files用于设置PHP-FPM对打开文件描述符的限制,默认值为1024。这个标签的值必须和Linux内核打开文件数关联起来,例如要将此值设置为65535,就必须在Linux命令行执行'ulimit -HSn 65536'。
1024
标签max_requests指明了每个children最多处理多少个请求后便会被关闭,默认的设置是500。
500
标签allowed_clients用于设置允许访问FastCGI进程解析器的IP地址。如果不在这里指定IP地址,Nginx转发过来的PHP解析请求将无法被接受。
127.0.0.1
5. 管理FastCGI进程
在配置完php-fpm后,就可以启动FastCGI进程了。启动fastcgi进程有两种方式:
/usr/local/php/bin/php-cgi --fpm
或者
/usr/local/php/sbin/php-fpm start
建议采用第二种方式启动FastCGI进程。 /usr/local/php/sbin/php-fpm还有其他参数,具体为start|stop|quit|restart|reload|logrotate。 每个启动参数的含义如下:
start,启动PHP的FastCGI进程
stop,强制终止PHP的FastCGI进程
quit,平滑终止PHP的FastCGI进程
restart, 重启PHP的FastCGI进程
reload, 重新加载PHP的php.ini
logrotate, 重新启用log文件
reload是个很重要的参数,它可以在PHP的FastCGI进程不中断的情况下重新加载改动过的php.ini,因此通过php-fpm可以平滑变更FastCGI模式下的PHP设置。
在FastCGI进程启动后,其监听的IP地址和端口也随即启动,可以通过ps和netstat查看相关信息。
netstat -antl|grep 9000
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
ps -ef|grep php-cgi
root 3567 1 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf
nobody 3568 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf
nobody 3569 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf
nobody 3570 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf
nobody 3571 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf
nobody 3572 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf
root 3583 3524 0 17:09 pts/1 00:00:00 grep php-cgi
五、配置Nginx来支持PHP
Nginx的安装特别简单,前面已经对此进行了详细介绍,这里不再进行讲述。下面重点介绍Nginx如何通过php-fpm的FastCGI进程对PHP进行解析处理。 由于Nginx本身不会对PHP进行解析,因此要实现Nginx对PHP的支持,其实是将对PHP页面的请求交给fastCGI进程监听的IP地址及端口。如果把php-fpm当做动态应用服务器,那么Nginx其实就是一个反向代理服务器。Nginx通过反向代理功能实现对PHP的解析,这就是Nginx实现PHP动态解析的原理。 这里假定Nginx的安装目录为/usr/local,则Nginx配置文件的路径为/usr/local/nginx/conf/nginx.conf。下面是在Nginx下支持PHP解析的一个虚拟主机配置实例。
server {
include port.conf;
server_name www.ixdba.net ixdba.net;
location / {
index index.html index.php;
root /web/www/www.ixdba.net;
}
location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME html$fastcgi_script_name;
include fastcgi_params;
}
}
通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理,而这里的IP地址和端口就是FastCGI进程监听的IP地址和端口。 fastcgi_param指令指定放置PHP动态程序的主目录,也就是$fastcgi_script_name前面指定的路径,这里是/usr/local/nginx/html目录,建议将这个目录与Nginx虚拟主机指定的根目录保持一致,当然也可以不一致。 fastcgi_params文件是FastCGI进程的一个参数配置文件,在安装Nginx后,会默认生成一个这样的文件,这里通过include指令将FastCGI参数配置文件包含了进来。 接下来,启动nginx服务。 /usr/local/nginx/sbin/nginx 到此为止,Nginx+PHP已经配置完成。
六、测试Nginx对PHP的解析功能
这里在/usr/local/nginx/html目录下创建一个phpinfo.php文件,内容如下: < ?php phpinfo(); ?> 然后通过浏览器访问,默认会在浏览器显示“Welcome to Nginx!”表示Nginx正常运行。 接着在浏览器中访问 phpinfo.php,如果PHP能够正常解析,会出现PHP安装配置以及功能列表统计信息。
七、实例讲解Nginx中FastCGI参数的优化
在配置完成Nginx+FastCGI之后,为了保证Nginx下PHP环境的高速稳定运行,需要添加一些FastCGI优化指令。下面给出一个优化实例,将下面代码添加到Nginx主配置文件中的HTTP层级。
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
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;
fastcgi_cache TEST;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
下面是对上述代码的含义进行介绍:
第一行代码是为FastCGI缓存指定一个文件路径、目录结构等级、关键字区域存储时间和非活动删除时间。
fastcgi_connect_timeout 指定连接到后端FastCGI的超时时间。
fastcgi_send_timeout 指定向FastCGI传送请求的超时时间,这个值是已经完成两次握手后向FastCGI传送请求的超时时间。
fastcgi_read_timeout 指定接收FastCGI应答的超时时间,这个值是已经完成两次握手后接收FastCGI应答的超时时间。
fastcgi_buffer_size 用于指定读取FastCGI应答第一部分需要用多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以设置为fastcgi_buffers选项指定的缓冲区大小。
fastcgi_buffers 指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求。如果一个PHP脚本所产生的页面大小为256KB,那么会为其分配4个64KB的缓冲区来缓存;如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。一般这个值应该为站点中PHP脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“16 16k”、“4 64k”等。
fastcgi_busy_buffers_size 的默认值是fastcgi_buffers的两倍。
fastcgi_temp_file_write_size 表示在写入缓存文件时使用多大的数据块,默认值是fastcgi_buffers的两倍。
fastcgi_cache 表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502错误的发生,但是开启缓存也会引起很多问题,要视具体情况而定。
fastcgi_cache_valid、fastcgi 用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一个小时,将301应答缓存1天,其他应答均缓存1分钟。

os x nginx和php-fpm

第一步,安装xcode,打开这个窗口,Install Command Line Tools

第二步,安装homebrew,为了安装一些php依赖的库
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
brew tap homebrew/dupes
brew tap josegonzalez/homebrew-php
brew install git
brew update
brew install wget mysql pcre freetype gd geoip jpeg libpng libtool

第三步,下载php源码包和nginx源码包
自行移步到 http://www.php.net/downloads.php 和 http://nginx.org/en/download.html
下载吧,下载完解压就不用教了吧?

第四步,编译php5.4
cd php5.4的源码文件夹
./configure  --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --sysconfdir=/private/etc --enable-cli --with-config-file-path=/etc --with-libxml-dir=/usr --with-openssl=/usr --with-kerberos=/usr --with-zlib=/usr --enable-bcmath --with-bz2=/usr --enable-calendar --disable-cgi --with-curl=/usr --enable-dba --enable-exif --enable-fpm --enable-ftp --with-gd --with-freetype-dir=/usr/X11 --with-jpeg-dir=/usr/local --with-png-dir=/usr/local --enable-gd-native-ttf --with-icu-dir=/usr --with-iodbc=/usr --with-ldap=/usr --with-ldap-sasl=/usr --with-libedit=/usr --enable-mbstring --enable-mbregex --with-mysql=mysqlnd --with-mysqli=mysqlnd --without-pear --with-pdo-mysql=mysqlnd --with-mysql-sock=/var/mysql/mysql.sock --with-readline=/usr --enable-shmop --with-snmp=/usr --enable-soap --enable-sockets --enable-sysvmsg --enable-sysvsem --enable-sysvshm --with-tidy --enable-wddx --with-xmlrpc --with-iconv-dir=/usr --with-xsl=/usr --enable-zip --with-pcre-regex=/usr --with-pgsql=/usr --with-pdo-pgsql=/usr
make
sudo make install

第五步,编译nginx
cd 到nginx的源码文件夹
./configure --prefix=/usr --sbin-path=/usr/sbin --conf-path=/private/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --with-poll_module  --with-http_ssl_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module  --with-http_spdy_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_dav_module --with-http_sub_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --http-log-path=/var/log/nginx/access.log

make
sudo make install

第六步,修改nginx,解决php白页
vim /etc/nginx/ fastcgi_param增加下面一行
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

第七步,开启php-fpm和nginx的服务
sudo /usr/sbin/php-fpm
sudo /usr/sbin/nginx
开启之后,可以写个php文件调试一下了。
nginx默认目录在/usr/html/,创建一个test.php 里面 写上一句
可以输入http://127.0.0.1/test.php测试一下了

第八步,增加自启动项
执行sudo -s命令,切换到管理员权限
在/Library/LaunchDaemons目录创建两个文件
org.lukin.php-fpm.plist,文件的内容:

http://www.apple.com/DTDs/PropertyList-1.0.dtd
">


  KeepAlive
 
  Label
  org.lukin.php-fpm
  Program
  /usr/sbin/php-fpm
  RunAtLoad
 
  WorkingDirectory
  /usr/local/var

org.lukin.nginx.plist,文件的内容:

http://www.apple.com/DTDs/PropertyList-1.0.dtd
">


  KeepAlive
 
  Label
  org.lukin.nginx
  Program
  /usr/sbin/nginx
  RunAtLoad
 
  WorkingDirectory
  /usr/local/var

增加开机启动任务,执行以下命令:
launchctl load -w /Library/LaunchDaemons/org.lukin.php-fpm.plist
launchctl load -w /Library/LaunchDaemons/org.lukin.nginx.plist

可以重启机器了,重启之后,用 netstat -nat | grep LISTEN 这个命令,看看是否已经开启相应的端口了。
80端口和9000如果已经有了,就说明你的配置都正常了。

2013年7月7日星期日

Mac OS X 安装 nginx


什么是Nginx?
Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器,在高连接并发的情况下Nginx 是 Apache 服务器不错的替代品.其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好.目前中国大陆使用nginx网站用户有:新浪、网易、 腾讯,另外知名的微网志Plurk也使用nginx。 
  Nginx 作为 负载均衡 服务器: 
Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP 代理服务器对外进行服务。 Nginx 采用 C 进行编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好很多。作为邮件代理服务器: 
  Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器), Last.fm 描述了成功并且美妙的使用经验。Nginx 是一个安装非常简单,配置文件非常简洁(还能够支持perl语法), Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动。 你还能够不间断服务的情况下进行软件版本的升级。

Nginx的安装
模块依赖性Nginx需要依赖下面3个包
1. gzip 模块需要 zlib 库 ( 下载: http://www.zlib.net/ )
2. rewrite 模块需要 pcre 库 ( 下载: http://www.pcre.org/ )
3. ssl 功能需要 openssl 库 ( 下载: http://www.openssl.org/ )


依赖包安装顺序依次为:openssl、zlib、pcre, 然后安装Nginx包.

图解教程
第一步: 下载安装所需包
openssl-fips-2.0.2.tar.gz
zlib-1.2.7.tar.gz
pcre-8.21.tar.gz
nginx-1.2.6.tar.gz
第二步:依次安装openssl-fips-2.0.2.tar.gz, zlib-1.2.7.tar.gz, pcre-8.21.tar.gz, nginx-1.2.6.tar.gz
1.安装openssl-fips-2.0.2.tar.gz
复制代码
[root@localhost mrms]# tar -zxvf openssl-fips-2.0.2.tar.gz 

[root@localhost mrms]# cd openssl-fips-2.0.2

[root@localhost openssl-fips-2.0.2]# ./config 

[root@localhost openssl-fips-2.0.2]# make

[root@localhost openssl-fips-2.0.2]# make install
复制代码
2.安装zlib-1.2.7.tar.gz
复制代码
[root@localhost mrms]# tar -zxvf zlib-1.2.7.tar.gz

[root@localhost mrms]# cd zlib-1.2.7

[root@localhost zlib-1.2.7]# ./configure 

[root@localhost zlib-1.2.7]# make

[root@localhost zlib-1.2.7]# make install
复制代码
3.安装pcre-8.21.tar.gz
复制代码
[root@localhost mrms]# tar -zxvf pcre-8.21.tar.gz

[root@localhost mrms]# cd pcre-8.21

[root@localhost pcre-8.21]# ./configure 

[root@localhost pcre-8.21]# make

[root@localhost pcre-8.21]# make install
复制代码
 4.安装 nginx-1.2.6.tar.gz
复制代码
[root@localhost mrms]# tar -zxvf nginx-1.2.6.tar.gz 

[root@localhost mrms]# cd nginx-1.2.6

[root@localhost nginx-1.2.6]# ./configure --with-pcre=../pcre-8.21 --with-zlib=../zlib-1.2.7 --with-openssl=../openssl-fips-2.0.2

[root@localhost nginx-1.2.6]# make

[root@localhost nginx-1.2.6]# make install
复制代码
至此Nginx的安装完成!
第三步:检测是否安装成功
[root@localhost nginx-1.2.6]# cd  /usr/local/nginx/sbin

[root@localhost sbin]# ./nginx -t
出现如下所示提示,表示安装成功
 
启动nginx
[root@localhost sbin]# ./nginx
查看端口
[root@localhost sbin]# netstat -ntlp
结果如下