Nginx 目前来说已经很流行了,所以打算把现有的Apache先替换一部分,在批量部署和管理方面都要考虑到。因为nginx的所有模块都是静态编译的不像apache那样可以动态添加模块,所以在一开始就要考虑清楚需求,结合现在很火的LAMP模式,其中P最常见的是PHP,目前较好的FastCGI的管理器有spaw-fcgi和php-fpm,而php老版本都是需要源码安装通过打补丁的方式把php-fpm打进去,spaw-fcgi是lighttpd默认的FastCGI管理器,因为牵扯到源码安装,当前的软件包版本在大规模部署起来不是很方便,但是还是有解决办法的。
Nginx安装方法:
1 apt网络安装
修改源列表
更新源列表并通过apt安装nginx
2 源码编译安装
先安装编译环境, 由于nginx在以后的使用中会需要用到perl正则、压缩算法、SSL等特性,所以我们需要提前安装相关库文件。
下载最新的稳定版nginx
wget http://nginx.org/download/nginx-1.2.3.tar.gz
解压查看编译选项
查看编译可选的配置参数(以下只是一些常用的配置项):
--prefix=PATH nginx的默认安装路径,没有指定的话。默认为/usr/local/nginx
--sbin-path=PATH nginx可执行命令文件的路径,没有指定的话,默认<prefix>/sbin/nginx
--conf-path=PATH nginx配置文件路径,没有指定的话,默认为<prefix>/conf/nginx.conf
--error-log-path=PATH 在nginx.conf中没有使用error_log指定错误日志路径时,默认<prefix>/logs/error.log
--http-log-path=PATH 定义被访问文件的日志存放路径,如果在nginx.conf中没有使用access_log指定,默认为<prefix>/logs/access.log
--pid-path=PATH 当在nginx.conf中没有使用pid指定pid文件路径时,默认为<prefix>/logs/nginx.pid
--lock-path=PATH 锁文件存放路由,如果在nginx.conf中没有指定,则默认为<prefix>/logs/nginx.lock
--user=USER 如果在Nginx.conf中没有使用user定义进程运行的属主,则默认为nobody
--group=GROUP 如果在Nginx.conf中没有使用user定义进程运行的属组,则默认为nobody
--builddir=DIR set build directory
--with-rtsig_module 使用rtsig模式
--with-select_module 使用select模式,如果当前平台没有其他有效模式,则默认编译
--without-select_module 禁止select模式
--with-poll_module 使用poll模式,如果当前平台没有其他有效模式,则默认编译
--without-poll_module 禁止poll模式
--with-file-aio enable file AIO support
--with-ipv6 开启IPV6支持
--with-debug 开启debug
以下这些模块默认没有开启,可以使用--with命令开启以下模块
--with-http_ssl_module 开启ssl模块
--with-http_realip_module 可以在后端记录客户端IP
--with-http_addition_module enable ngx_http_addition_module
--with-http_flv_module 开启flv模块
--with-http_mp4_module 开启mp4模块
--with-http_gzip_static_module 开启gzip模块
--with-http_secure_link_module enable ngx_http_secure_link_module
--with-http_stub_status_module 开启状态查看模块
以下模块默认是开启的,可以使用--without选项关闭相关模块
--without-http_charset_module disable ngx_http_charset_module
--without-http_gzip_module 禁用gzip压缩模块
--without-http_ssi_module 禁用ssl模块
--without-http_userid_module disable ngx_http_userid_module
--without-http_access_module 禁用access模块
--without-http_auth_basic_module 禁用auth_basic认证模块
--without-http_autoindex_module 禁用列目录模块
--without-http_geo_module 禁用geo模块
--without-http_map_module 禁用map模块
--without-http_referer_module disable ngx_http_referer_module
--without-http_rewrite_module 禁用重定向模块
--without-http_proxy_module 禁用代理模块
--without-http_fastcgi_module 禁用fastcgi模块
--without-http_uwsgi_module disable ngx_http_uwsgi_module
--without-http_scgi_module disable ngx_http_scgi_module
--without-http_memcached_module disable ngx_http_memcached_module
--without-http_limit_conn_module disable ngx_http_limit_conn_module
--without-http_limit_req_module disable ngx_http_limit_req_module
--without-http_empty_gif_module disable ngx_http_empty_gif_module
--without-http_browser_module disable ngx_http_browser_module
--without-http_upstream_ip_hash_module 禁用upstream模块
--with-http_perl_module 开启perl模块
--with-perl_modules_path=PATH 设置perl模块路径
--with-perl=PATH 为perl库设置路径
--http-client-body-temp-path=PATH set path to store http client request body temporary files
--http-proxy-temp-path=PATH set path to store http proxy temporary files
--http-fastcgi-temp-path=PATH set path to store http fastcgi temporary files
--http-uwsgi-temp-path=PATH set path to store http uwsgi temporary files
--http-scgi-temp-path=PATH set path to store http scgi temporary files
--without-http 禁用http服务
--without-http-cache 禁用http cache
--with-mail 开启mail服务
--with-mail_ssl_module 在mail服务中开启ssl
--without-mail_pop3_module disable ngx_mail_pop3_module
--without-mail_imap_module disable ngx_mail_imap_module
--without-mail_smtp_module disable ngx_mail_smtp_module
--with-google_perftools_module 开启google_perftools模块
--with-cpp_test_module 开启cpp_test模块
--add-module=PATH enable an external module
--without-pcre 禁止使用perl正则库
--with-pcre 强制使用perl正则库
编译安装
结果如下图:
编译并安装
PS: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不支持对外部程序的直接解析,所有的外部程序(包括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的整个运作过程。
php-fpm
PHP5.3版本源码已经默认支持php-fpm了,但是debian6认为它还没经过广泛的测试,所以在debian6的软件仓库中,虽然php版本为5.3.3,但是却没包含php-fpm,如果不想手工编译安装php的话可以换一个源。
修改源列表
更新源列表,安装php5-fpm
安装其他常用php5组件
启动php-fpm
这样的话最基本的nginx+php环境就搭建完毕了。
Nginx配置文件粗解
nginx的配置文件结构类似下图这样的结构:
配置文件主要参照编译完成后生成的默认配置文件。
主模块的配置选项
user指令设置进程以什么用户运行,在源码编译安装时指定的nginx用户,如果在编译时没有指定,默认是nobody账户,在配置文件中此行处于注释状态, user 指令可以设置两个参数,第一个指定进程所属用户,第二个是可选,指定进程所属组
设置工作进程数,一个工作进程为一个单线程,在CPU密集型环境中,可以设置worker_processes数目为CPU核数
指定nginx错误日志文件的位置,如果要禁止错误日志使用error_log /dev/null,error_log可以存在于不同的字段main、http、server等,文件后面可以指定记录的日志的默认等级。
设置pid文件路径,可以使用kill命令发送相关信号
event模块配置选项,event模块主要控制nginx处理连接的方式
http模块里面主要是对http服务器相关属性进行设置
server模块嵌在http模块中,主要用来配置虚拟主机