Nginx 学习笔记

 常见web服务器php

apache
loghttpd
tomcat
IBM websphere
Microsoft IIS


Nginx 的中文维基

Nginx ("engine x") 是一个高性能的 HTTP 和  反向代理  服务器,也是一个 IMAP/POP3/SMTP  代理服务器  。 Nginx 是由  Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru  站点开发的,它已经在该站点运行超过四年多了。Igor 将源代码以类BSD许可证的形式发布。自Nginx 发布四年来,Nginx 已经由于它的稳定性、丰富的功能集、 示例配置文件和低系统资源的消耗而闻名了。目前国内各大门户网站已经部署了Nginx,如新浪、网易、腾讯等;国内几个重要的视频分享网站也部署了Nginx,如六房间、酷6等。 新近发现Nginx 技术在国内日趋火热,愈来愈多的网站开始部署Nginx。html

 
使用BSD协议   2011市场占有率为nginx5.3%  apache70% IIS 20.5%
 
 
Nginx优点
1.高并发,CPU消耗低
    Nginx支持5W高并发链接,实际2-4W.
    使用epoll(linux2.6内核)和kqueue(freeBSD)网络模型 
    而Apache使用传统select模型和prefork多进程模式
2.内存消耗少
    同等硬件条件下Nginx的处理能力是Apache的5-10倍
3.成本低廉
    使用BSD协议发行
4.其它优点
   配置简单、支持Rewrite重写、内置健康检查功能、节省带宽、稳定性高、支持热部署
 
Nginx的版本
    Nginx分旧稳定版、新稳定版和开发版三个版本
    从0.7版本开始支持windows版,但其效率较低下
Nginx编译需求
    10M磁盘空间
    GCC编译器
    autoconf和automake工具
 
模块依赖性   
    gzip模块须要zlib库
    rewrite模块须要pcre库
    SSL功能须要Openssl库
 
./configure经常使用参数 
    --prefix=<path>                安装路径,默认为/usr/local/nginx
    --sbin-path=<path>            执行文件安装路径,默认为<prefix>/sbin/nginx
    --conf-path=<path>            在没有给定-c选项下的默认路径,默认为<prefix>/conf/nginx.conf
    --pid-path=<path>               PID路径,没有指定PID下的路径为<prefix>/logs/nginx.pid
    --lock-path=<path>             nginx.lock文件路径
    --error-log-path=<path>       错误日志路径
    --http-log-path=<path>        access_log路径
    --user=<user>                   Nginx使用用户,默认为nobody
    --group=<group>               Nginx使用的组,默认为nobody
    --with-resig_module            启用rtsig模块
    --with-select_module           是否容许启动SELECT模式,如没有Kqueue.epoll.rtsig或poll,select模式僵尸默认模式
    --with-poll_module               没有更好的模式则启动poll模式
    --with-http_ssl_module         开启SSL模块,debian上是libssl
    --with-http_realip_module       启动htto_realip_module
    --with-http_addition_module    启动http_addittion_module
    --with-http_sub_module        启动http_sub_module
    --with-http_flv_moudle           启动flv模块
    --with-http_charset_module    禁用server status页
    --with-http_gzip_module        禁用gzip
    --with-http-rewrite_module      禁用rewrite
    --with-http_proxy_module       禁用proxy
    --with-http_perl_module        禁用perl模块
    --http-client-body-temp-path=PATH    http客户端请求缓存文件路径
    --http-proxy-tmp-path=PATH             http反向代理缓存文件目录
    --without-http                        禁用http SERVER   
    --with-mail                            启用IMAP4/POP3/SMTP代理
    --with-mail_ssl_module            maillsll模块
    --without-pcre                       禁用PCRE库
    --with-zlib=DIR                    zlib库路径
    --with-openssl=DIR                openssl库路径
    --with-dubug                        启用调速日志
    --add-module=PATH                添加第三方模块的目录
 
 
 ./configure    --user=www --group=www   --with-pcre=/usr/include/pcre --with-http_stub_status_module --prefix=/usr/local/nginx --with-http_ssl_module

启动nginx
    /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    如不加-c则默认使用安装目录下/conf/nginx.conf
 
配置检查
    nginx -t -c  /usr/local/nfinx/conf/nginx.conf
 
平滑重启,从新加载配置文件
    ps -ef|grep nginx
 
    kill -HUP    `cat \usr\local\nginx\logs\'nginx.pid`
 
其它信号
    TERM,INT         快速关闭
    QUIT                从容关闭
    USR1                从新打开日志
    USR2                平滑升级
    WITCH               从容关闭工做进程
 
平滑升级
    在不中断服务的状况下使用新版本、从新编译的程序
    1.备份旧的执行文件
    2.kill -USR2 旧版本主进程号
        旧的.pid文件将重命名为old.bin而后执行新的可执行程序
        依次启动新主进程和工做进程
    3.此时新旧版本同时运行,使用WINCH信号发送给旧的主进程,而后他的工做进程也将从容关闭
        kill -WINCH    旧版本主进程号
    4.一段时间后旧的工做进程处理已有链接请求后退出
    5.此时可决定是否使用新的进程
        如不使用
        kull -HUP 旧进程号               不重载配置文件下重启工做进程
        kill  -QUIT   新主进程             从容关闭其工做进程
        kill -TERM   新主进程            强制退出
        新进程退出后旧进程将移除.oldbin前缀,恢复到.pid文件
 
        若是使用
        kill -QUIT 旧的主进程
 
虚拟主机的配置
----------------------------------------------------------------------------------
 
worker_processes  1;
#指定工做衍生进程数(通常为CPU总核心数的两倍)
 
events 
{
     worker_connections  1024;
     #容许的链接数量
}
 
http {
   include     mime.types;
   default_type  application/octet-stream;
 
   sendfile     on;
   keepalive_timeout  65;
 
   server
     {
     listen     80;
     server_name  www.vspace.tk *.vspace.tk;
     access_log  logs/www.vspace.tk  main;
       location /
           {
            root   /etc/web/www;
            index  index.html index.htm;
          }
     }
   server
     {
     listen      80;
     server_name    bbs.vspace.tk;
     access_log    log/bbs.vspace.tk combined;
     location /
             {
             root   /etc/web/bbs;
             index   index.html index.htm;
         }
     }
}
--------------------------------------------------------------------------------
 
 

3)虚拟主机配置文件详解
  
因为虚拟主机分别有一个文件来指定,下面举例某个虚拟主机的配置以下:
[root@oracle132 vhosts]#
vi /usr/local/nginx/conf/vhosts/www.test.com.conf;
  
server {
        listen       80; #虚拟主机使用端口
        server_name  www.test.com; #虚拟主机访问域名
        charset UTF-8; #设定nginx默认字符编码
        #access_log logs/host.access.log main;
#全部jpg格式的图片都有nginx来处理
        location ~ \.jpg$ {
                root    /cicro/cws3/vhosts/www.test.com/ROOT;
                expires 30d;
        }
#全部gif格式的图片都有nginx来处理
        location ~ \.gif$ {
                root    /cicro/cws3/vhosts/www.test.com/ROOT;
                expires 30d;
        }
# upload和html下全部文件都有nginx来处理
前端

        location ~ ^/(upload|html)/  {linux

                root    /cicro/cws3/vhosts/www.test.com/ROOT;nginx

                expires 30d;web

        }算法

#除去上面的文件,剩下的全部都代理给http://127.0.0.1:8009来访问shell

        location / {apache

            root   /cicro/cws3/vhosts/www.test.com/ROOT;windows

            index  index.html;

            proxy_pass  http://127.0.0.1:8009;

        }
#设定查看Nginx状态的地址

        location /NginxStatus {

                        access_log              on;

                        auth_basic              "NginxStatus";

auth_basic_user_file    ../htpasswd;

        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html

        #

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

}

 在上面有设置查看Nginx状态的地址,须要apache的htpasswd 来生成一个登陆验证文件,这样生成一个htpasswd 文件:

[root@oracle132 vhosts]# /usr/local/bin/htpasswd  -c htpasswd gaojf

New password:   (此处输入您的密码)
Re-type new password:   (再次输入您的密码)
Adding password for user  gaojf

 

上面 /usr/local/bin/htpasswd 是htpasswd 文件的执行路径,若是没有这个文件,能够从apache的bin目录拷贝一个过来便可!

-c是建立一个文件

-c后面的httpasswd是建立验证文件的名字.

gaojf是建立的用户

 

#查看nginxstatus:
http://www.test.com/nginxstatus/,输入验证账号密码,便可看到相似以下内容:
Active connections: 328
server accepts handled requests
9309 8982 28890
Reading: 1 Writing: 3 Waiting: 324
  第一行表示如今活跃的链接数
  第三行的第三个数字表示Nginx运行到当前时间接受到的总请求数,假如快达到了上限,就须要加大上限值了。

 
日志
 
   log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
            '$status $body_bytes_sent "$http_referer" '
            '"$http_user_agent" "$http_x_forwarded_for"';
    若是web前端存在中间层则收集不到remote_addr而是拿到前端的地址
    可是反向代理在转发请求的http头信息中,能够增长X-Forwarded-For信息,来记录原有客户端IP
 
logs/www.log
 
192.168.10.138 - - [19/Mar/2011:18:04:59 +0800] "GET / HTTP/1.1" 200 34 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)" "-"
127.0.0.1 - - [19/Mar/2011:19:02:43 +0800] "GET / HTTP/1.1" 200 34 "-" "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.151 Safari/534.16" "-"
 
access_log
 
    access_log /data/logs/web1.log main
    也可以使用变量
    access_log /data/logs/$server_name.log main
    但有一些限制,1.Nginx进程的用户和组必须有该路径的读写权限
                        2.缓存将不会被使用
                        3.对于每一条日志记录,日志文件都将先打开文件再写入日子而后关闭
    为了提升包含变量的日志文件存放路径的性能须要使用open_log_file_cache指令设置经常常被使用的日志文件描述符缓存
 
    open_log_file_cache指令主要用来设置含有变量的日子路径的文件描述符缓存
    语法:    open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time] | off
    默认我禁止
    max:设置缓存中的最大文件描述符数量。如超过则使用LRU算法清除“较不经常使用的文件描述符”
    iniactive:设置一个时间,若是时间内没有使用此文件描述符则删除,默认10s
    min_uses:在inactive指定时间范围内,若是日志文件超过被使用次数则记入缓存,默认为1
    valid:设置多久检查一次,看看变量指定的日志文件路径与文件名是否存在,默认60s
    open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m
 
 
Nginx日志文件的切割
    nginx不支持像Apache同样使用cronolog来轮转日志,可是能够采用如下方式来实现日志文件的切割
    mv /data/logs/access.log  /data/logs/20110101.log
    kill -USR1 Nginx主进程号
 
 
能够经过crontab和shell脚原本实现日志切割的自动化
 
nginx_cut_log.sh
---------------------------------------------------------------------
#!/bin/bash
#这个脚本须在天天00:00运行
 
#Nginx 日志文件的存放路径
logs_path="/usr/loacl/nginx/logs/"
 
mkdir -p ${log_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
-------------------------------------------------------------------------
 
crontab -e
00 00 * * * /bin/bash  /usr/local/nginx/sbin/cut_nginx_log.sh
 
nginx浏览器本地缓存设置
    语法:expir [time|epoch|max|off]        默认为off
    做用域:http、server、location
    控制http应答中的expires和cache-control的header头信息起到控制页面缓存的做用
    
    time为当前时间-/+来得到
        负数表示no-cache
     正数或零表示max-age=time
    
    epoch指定expires值为1 January,1970,00:00:01 GMT
    max指定expires值为31 December 2037 23:59:59 GMT
       -1:指定“Expires”的值为当前服务器时间-1s,即永远过时。
    
     off:不修改“Expires”和"Cache-Control"的值
    
例如
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires 30d;
    }
 
 
 
安装过程
 
PHP加速
; eaccelerator
[eaccelerator]
zend_extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
eaccelerator.shm_size="128"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="3600"
eaccelerator.shm_prune_period="3600"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
eaccelerator.keys = "disk_only"
eaccelerator.sessions = "disk_only"
eaccelerator.content = "disk_only"
eaccelerator.allowed_admin_path = "/ext/web/www/eaccelerator/control.php"
 
 
内核优化
相关文章
相关标签/搜索