nginx学习笔记

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx学习笔记相关的知识,希望对你有一定的参考价值。

nginx(发音engine x)专为性能优化而开发,其最知名的优点是它的稳定性和低系统资源消耗,以及对HTTP并发连接的高处理能力(单台物理服务器可支持30000~50000个并发请求)。正因为如此,大量提供社交网站、新闻资讯、电子商务以及虚拟主机等服务的企业纷纷选择Ngnix来提供WEB服务。如新浪,金山,网易,腾讯,百度文库,51cto,人人网等。


apache 7000 select   nginx 30000 epoll
squid         nginx
lvs 4        nginx 7

网站应用统计站点:http://news.netcraft.com/

Nginx官方站点:http://www.nginx.org
淘宝Tengine:http://tengine.taobao.org/

最新的稳定版:1.6.2
最新的开发板:1.7.9

http://nginx.org/download/nginx-1.6.2.tar.gz

1)安装支持软件:
Nginx的配置及运行需要pcre、zlib等软件包的支持,因此应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保Nginx的安装顺利完成。

[[email protected] ~]# service iptables stop
[[email protected] ~]# setenforce 0
[[email protected] ~]# mount /dev/cdrom /mnt/
[[email protected] ~]# vim /etc/yum.repos.d/yum.repo
[base]
name=RedHat Enterprise Linux Server
baseurl=file:///mnt/Server
gpgcheck=0
[[email protected] ~]# yum -y install pcre-devel zilb-devel

2)创建运行用户、组:
Nginx服务程序默认以nobody身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限,增加灵活性、降低安全风险。如:创建一个名为nginx的用户,不建立宿主目录,也禁止登录到shell环境。

[[email protected] ~]# useradd -M -s /sbin/nologin nginx

3)编译安装nginx:
释放nginx源码包
[[email protected] ~]# tar xf nginx-1.6.2.tar.gz -C /usr/src/

编译前配置:
[[email protected] ~]# cd /usr/src/nginx-1.6.2/
[[email protected] nginx-1.6.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module

注:配置前可以参考:./configure --help给出说明
--prefix        设定Nginx的安装目录
--user和—group    指定Nginx运行用户和组
--with-http_stub_status_module    启用http_stub_status_module模块以支持状态统计
--with-http_ssl_module     启用SSL模块
--with-http_flv_module    启用FLV模块,提供寻求内存使用基于时间的偏移量文件

编译 安装:
[[email protected] nginx-1.6.2]# make && make install

为了使Nginx服务器的运行更加方便,可以为主程序nginx创建链接文件,以便管理员直接执行nginx命令就可以调用Nginx的主程序。

[[email protected] nginx-1.6.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/
[[email protected] nginx-1.6.2]# ll /usr/local/bin/nginx
lrwxrwxrwx 1 root root 27 12-29 07:24 /usr/local/bin/nginx -> /usr/local/nginx/sbin/nginx

Nginx的运行控制:
与Apache的主程序httpd类似,Nginx的主程序也提供了"-t"选项用来对配置文件进行检查,以便找出不当或错误的配置。配置文件nginx.conf默认位于安装目录/usr/local/nginx/conf/目录中。若要检查位于其他位置的配置文件,可使用"-c"选项来指定路径。

[[email protected] conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

启动、停止Nginx:
直接运行nginx即可启动Nginx服务器,这种方式将使用默认的配置文件,若要改用其他配置文件,需添加"-c 配置文件路径"选项来指定路径。需要注意的是,若服务器中已安装有httpd等其他WEB服务软件,应采取措施(修改端口,停用或卸载)避免部突。

[[email protected] conf]# netstat -anpt |grep :80
[[email protected] conf]# nginx
[[email protected] conf]# netstat -anpt |grep :80
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      6810/nginx: master  

通过检查 Nginx程序的监听状态,或者在浏览器中访问此WEB服务(默认页面将显示"Welcome to nginx!"),可以确认Nginx服务是否正常运行。

[[email protected] ~]# elinks --dump http://localhost
                               Welcome to nginx!
                               
主程序Nginx支持标准的进程信号,通过kill或者killall命令传送

HUP        重载配置    等同于-1
QUIT    退出进程    等同于-3
KILL    杀死进程                
[[email protected] ~]# killall -s HUP nginx
[[email protected] ~]# killall -s QUIT nginx
[[email protected] ~]# netstat -anpt |grep :80

当Nginx进程运行时,PID号默认存放在logs/目录下的nginx.pid文件中,因此若改用kill命令,也可以根据nginx.pid文件中的PID号来进行控制。

为了使Nginx服务的启动、停止、重载等操作更加方便,可以编写Nginx服务脚本,并使用chkconfig和service工具来进行管理,也更加符合RHEL系统的管理习惯。


[[email protected] ~]# vim /etc/init.d/nginx

脚本一:

#!/bin/bash
# chkconfig: 2345 99 20
# description: Nginx Server Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
    $PROG
;;
stop)
    kill -s QUIT $(cat $PIDF)
;;
restart)
    $0 stop
    $0 start
;;
reload)
    kill -s HUP $(cat $PIDF)
;;
*)
    echo "Usage: $0 (start|stop|restart|reload)"
    exit 1
esac
exit 0

[[email protected] ~]# chmod +x /etc/init.d/nginx
[[email protected] ~]# chkconfig --add nginx
[[email protected] ~]# chkconfig nginx on
[[email protected] ~]# chkconfig --list nginx
nginx              0:关闭    1:关闭    2:启用    3:启用    4:启用    5:启用    6:关闭

这样就可以通过nginx脚本来启动、停止、重启、重载Nginx服务器了。

3、配置文件nginx.conf:
在Nginx服务器的主配置文件nginx.conf中,包括全局配置、I/O事件配置、HTTP配置这三大块内容,配置语句的格式为"关键字 值;"(末尾以分号表示结束),以"#"开始的部分表示注释。

1)全局配置
由各种配置语句组成,不使用特定的界定标记。全局配置部分包括运行用户、工作进程数、错误日志、PID存放位置等基本设置。
常用配置项:

user nginx;            //运行用户,Nginx的运行用户实际是编译时指定的nginx,若编译时未指定则默认为nobody
worker_processes 2;        //指定nginx启动的工作进程数量,建议按照cpu数目来指定,一般为它的倍数
worker_cpu_affinity 00000001 00000010;    //为每个进程分配cpu,上例中将2个进程分配到两个cpu,当然可以写多个,或者将一个
进程分配到多个cpu
worker_rlimit_nofile 102400;            //这个指令是指当一个nginx进程打开的最多文件数目,理论值应该是最多打开文件数(ulimit
-n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值
保持一致。(通过"ulimit –n 数值"可以修改打开的最多文件数目)
error_log logs/error.log;                 //全局错误日志文件的位置
pid logs/nginx.pid;                     //PID文件的位置


2)I/O事件配置:
使用"events {}"界定标记,用来指定Nginx进程的I/O响应模型,每个进程的连接数等设置
events {
use epool;         //使用epool模型,对于2.6以上的内核,建议使用epool模型以提高性能
worker_connections 4096;        //每个进程允许的最多连接数(默认为1024),每个进程的连接数应根据实际需要来定,一般在10000以下,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections,具体还要看服务器的硬件、带宽等。
}

3)HTTP配置
使用"http{}"界定标记,包括访问日志、HTTP端口、网页目录、默认字符集、连接保持、以
及虚拟主机、php解析等一系列设置。其中大部分配置语句包含在子界定标记"server {}"内。

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
                      ‘$status $body_bytes_sent "$http_referer" ‘
                      ‘"$http_user_agent" "$http_x_forwarded_for"‘;

    access_log  logs/access.log  main;        //访问日志位置

    sendfile        on;                        //支持文件发送(下载)
    keepalive_timeout  65;                    //连接保持超时

    
    gzip on;
    gzip_min_length 1k;
    gzip_buffer 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_type text/plain application/x-javascript text/css application/xml;
    gzip_cary on;
    
    
    server {                                //web服务的监听配置
        listen       80;                    //监听地址及端口
        server_name  www.benet.com;            //网站名称(FQDN)
        charset utf-8;                        //网页的默认字符集

        location / {                        //跟目录配置
            root   html;                    //网站根目录的位置安装位置的html中
            index  index.html index.htm;    //默认首页(索引页)
        }

        error_page   500 502 503 504  /50x.html;    //内部错误的反馈页面
        location = /50x.html {                //错误页面配置
            root   html;
        }
        
        location /download {
          autoindex on;
        }
        
        error_page   403 404  /40x.html;
        location = /40x.html {
            root   html/error;
        }
        
         location ~ /status {
            stub_status on;        //打开状态统计功能
            access_log off;        //关闭此位置的日志记录
        }
    }






自动索引

        
[[email protected] ~]# cd /usr/local/nginx/html/
[[email protected] html]# mkdir download
[[email protected] html]# touch download/kernel.tar.gz
[[email protected] html]# touch download/abort.txt
[[email protected] html]# service nginx reload

自定义错误页面


mkdir /usr/local/nginx/html/error
echo "Net Found" >  /usr/local/nginx/html/error/40x.html

-----------------------------------------------------------------------


listen 支持采用 IP地址:端口 形式

4、状态统计及虚拟主机应用:
Nginx内置了HTTP_STUB_STATUS状态统计模块,用来反馈当前的WEB访问情况。配置
编译参数时可添加—with-http_stub_stastus_module来启用此模块。要使用Nginx的状态统计功能,除了启用内建模块以外,还需要修改nginx.conf文件,指定访问位置并打开stub_status配置。在http{}配置的server{}子配置内添加如下配置项
[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf

        location ~ /status {
            stub_status on;        //打开状态统计功能
            access_log off;        //关闭此位置的日志记录
        }

[[email protected] conf]# service nginx restart

浏览器访问 http://192.168.200.128/status

Active connections: 1
server accepts handled requests
 1 1 3
Reading: 0 Writing: 1 Waiting: 0


Active connections    表示当前活跃的连接数,
第三行的三个数字表示Nginx当前总共    处理了1个连接,成功创建1次握手,总共处理了3个请求。
最后一行的Reading表示Nginx读取到客户端Header信息数,
Writing表示Nginx返回给客户端的Header信息数
“Waiting”表示Nginx已经处理完,正在等候下一次请求指令时的驻留连接数。


Nginx 支持为目录添加密码认证,使用apache 的 htpasswd 来创建密码文件

[[email protected] ~]# yum -y install httpd
[[email protected] ~]# htpasswd -c /usr/local/nginx/.htpasswd crushlinux
New password:
Re-type new password:
Adding password for user crushlinux

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf
        location ~ /status {
            stub_status on;
            access_log off;
            auth_basic "Nginx Status";
            auth_basic_user_file /usr/local/nginx/.htpasswd;
        }
        
客户端访问控制:
[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf
        location ~ /status {
            stub_status on;
            access_log off;
            auth_basic "Nginx Status";
            auth_basic_user_file /usr/local/nginx/.htpasswd;
            allow 192.168.200.1;
            deny 192.168.200.0/24;
        }

注:allow 允许规则,deny拒绝规则;规则的执行是按从上向下执行,匹配某条规则后将不再检查其他规则。


2)虚拟主机:
使用Nginx搭建虚拟主机服务器时,每个虚拟WEB站点拥有独立的"server {}"配置段,各自监听的IP地址、端口号可以单独指定,当然网站名称也是不同的。
例如:要创建两个站点www.benet.com和www.accp.com
为两个虚拟WEB主机分别建立根目录,并准备测试首页

[[email protected] ~]# mkdir /usr/local/nginx/html/benet
[[email protected] ~]# mkdir /usr/local/nginx/html/accp
[[email protected] ~]# echo "<h1>www.benet.com</h1>" > /usr/local/nginx/html/benet/index.html
[[email protected] ~]# echo "<h1>www.accp.com</h1>" > /usr/local/nginx/html/accp/index.html
[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
                      ‘$status $body_bytes_sent "$http_referer" ‘
                      ‘"$http_user_agent" "$http_x_forwarded_for"‘;

    access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  www.benet.com;
    charset utf-8;
        access_log  logs/benet.access.log  main;

        location / {
            root   html/benet;
            index  index.html index.htm;
        }
    }

    server {
        listen       80;
        server_name  www.accp.com;
        charset utf-8;
        access_log  logs/accp.access.log  main;

        location / {
            root   html/accp;
            index  index.html index.htm;
        }
    }
}
 
编写每天定时切割Nginx日志的脚本
1、创建脚本
[[email protected] ~]# vi /usr/local/nginx/sbin/cut_nginx_log.sh
#!/bin/bash
# This script run at 00:00

# The Nginx logs path
logs_path="/usr/local/nginx/logs/"

mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

2、设置crontab,每天凌晨00:00切割nginx访问日志
[[email protected] ~]# chmod +x /usr/local/nginx/sbin/cut_nginx_log.sh
[[email protected] ~]# crontab -e
00 00 * * * /bin/bash  /usr/local/nginx/sbin/cut_nginx_log.sh
[[email protected] ~]# service crond restart

以上是关于nginx学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

设计模式:学习笔记——抽象工厂模式

Java设计模式学习笔记

设计模式:学习笔记——建造者模式

设计模式学习笔记 之 简单工厂模式

设计模式Eric的学习笔记

设计模式学习笔记(十三:原型模式)