Nginx(一):基础与配置文件简介 简介: Nginx是一款由俄罗斯程序员Igor Sysoev所开发轻量级的网页服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。Nginx是
Nginx(一):基础与配置文件简介
简介: Nginx是一款由俄罗斯程序员Igor Sysoev所开发轻量级的网页服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。与旧版本(<=2.2)的Apache不同,nginx不采用每客户机一线程的设计模型,而是充分使用异步逻辑,削减了上下文调度开销,所以并发服务能力更强。整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。整体采用模块化设计是nginx的一个重大特点,甚至http服务器核心功能也是一个模块。要注意的是:nginx的模块是静态的,添加和删除模块都要对nginx进行重新编译,这一点与Apache的动态模块完全不同。
基本功能:
静态资源的web服务器,能缓存打开的文件描述符;
反向代理服务器,缓存、负载均衡;
支持FastCGI
模块化,非DSO机制,过滤器gzip,SSI和图像大小调整等
支持SSL
扩展功能:
基于名称和IP做虚拟主机
支持keepalive
支持平滑配置更新或程序版本升级
定制访问日志,支持使用日志缓存以提高性能
支持url rewrite
支持路径别名
支持基于IP及用户的认证;
支持速率限制,并发限制等;
nginx的基本架构:
一个master进程,生成一个或多个worker进程
事件驱动:kqueue(Freebsd),epoll(Linux),/dev/poll(Sun)
消息通知:select,poll,rt signals
支持sendfile,sendfile64
文件AIO
支持mmap
nginx:非阻塞、事件驱动、一个master多个worker,一个worker响应多个用户请求;
nginx的模块类别:
Nginx core module:nginx的核心模块
Standard HTTP modules:nginx的标准模块
Optional HTTP modules:nginx的可选模块
Mail modules:nginx的邮件模块
3rd party modules:nginx的第三方模块
nginx相对apache的优点:
轻量级,同样起web 服务,比apache占用更少的内存及资源
抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
高度模块化的设计,编写模块相对简单
社区活跃,各种高性能模块出品迅速啊
apache 相对nginx 的优点:
rewrite ,比nginx 的rewrite 强大
模块超多,基本想到的都可以找到
少bug ,nginx 的bug 相对较多
超稳定
编译安装:
官方网站:http://nginx.org/
安装开发环境,并解决软件依赖关系:
[root@node0 ~]# yum groupinstall "Development Tools" "Server Platform Deveopment"[root@node0 ~]# yum install pcre-devel zlib-devel
创建nginx用户和nginx组:
[root@node0 ~]# groupadd -r nginx[root@node0 ~]# useradd -g nginx -r nginx
编译安装:
[root@node0 ~]# tar xf nginx-1.8.0.tar.gz[root@node0 ~]# cd nginx-1.8.0/[root@node0 nginx-1.8.0]# ./configure --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/usr/local/nginx/client/ --http-proxy-temp-path=/usr/local/nginx/proxy/ --http-fastcgi-temp-path=/usr/local/nginx/fcgi/ --http-uwsgi-temp-path=/usr/local/nginx/uwsgi --http-scgi-temp-path=/usr/local/nginx/scgi --with-pcre[root@node0 nginx-1.8.0]# make && make install
选项解释:
--prefix=/usr/local/nginx //:nginx安装目录--sbin-path=/usr/sbin/nginx //:可执行命令路径--conf-path=/etc/nginx/nginx.conf //:默认配置文件路径--pid-path=/var/run/nginx.pid //:pid文件路径--lock-path=/var/lock/nginx.lock //:lock文件路径--http-log-path=/var/log/nginx/access.log //:访问日志路径--error-log-path=/var/log/nginx/error.log //:报错日志路径--user=nginx //:运行用户--group=nginx //:运行组--with-http_ssl_module //:启用ssl模块--with-http_flv_module //:启用flv模块--with-http_stub_status_module //:启用可监控服务状态页--with-http_gzip_static_module //:启用压缩传输--with-pcre //:支持pcre库,增强的正则表达式分析工具--http-client-body-temp-path=/usr/local/nginx/client/ //:http请求实体临时文件路径--http-proxy-temp-path=/usr/local/nginx/proxy/ //:http代理临时文件路径--http-fastcgi-temp-path=/usr/local/nginx/fcgi/ //:http_fastcgi临时文件路径--http-uwsgi-temp-path=/usr/local/nginx/uwsgi //:http_uwsgi临时文件路径--http-scgi-temp-path=/usr/local/nginx/scgi //:http_scgi临时文件路径
提供服务启动脚本:
[root@node0 nginx]# cat /etc/rc.d/init.d/nginx#!/bin/sh## nginx - this script starts and stops the nginx daemon## chkconfig: - 85 15# description: NGINX is an HTTP(S) server, HTTP(S) reverse /# proxy and IMAP/POP3 proxy server# processname: nginx# config: /etc/nginx/nginx.conf# config: /etc/sysconfig/nginx# pidfile: /var/run/nginx.pid# Source function library.. /etc/rc.d/init.d/functions# Source networking configuration.. /etc/sysconfig/network# Check that networking is up.[ "$NETWORKING" = "no" ] && exit 0nginx="/usr/sbin/nginx"prog=$(basename $nginx)NGINX_CONF_FILE="/etc/nginx/nginx.conf"[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginxlockfile=/var/lock/subsys/nginx.lockmake_dirs() { # make required directories user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=/([^ ]*/).*//1/g' -` if [ -z "`grep $user /etc/passwd`" ]; then useradd -M -s /bin/nologin $user fi options=`$nginx -V 2>&1 | grep 'configure arguments:'` for opt in $options; do if [ `echo $opt | grep '.*-temp-path'` ]; then value=`echo $opt | cut -d "=" -f 2` if [ ! -d "$value" ]; then # echo "creating" $value mkdir -p $value && chown -R $user $value fi fi done}start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 make_dirs echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval}stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval}restart() { configtest || return $? stop sleep 1 start}reload() { configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo}force_reload() { restart}configtest() { $nginx -t -c $NGINX_CONF_FILE}rh_status() { status $prog}rh_status_q() { rh_status >/dev/null 2>&1}case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2esac
启动服务:
[root@node0 nginx]# chmod +x /etc/rc.d/init.d/nginx[root@node0 nginx]# chkconfig nginx --add[root@node0 nginx]# chkconfig nginx on[root@node0 nginx]# service nginx start
测试访问:
nginx主配置文件支持vim高亮:
下载nginx.vim:http://www.vim.org/scripts/script.php?script_id=1886
[root@node0 ~]# mkdir -p ./.vim/syntax[root@node0 ~]# cp nginx.vim ./.vim/syntax/[root@node0 ~]# vim ./.vim/filetype.vimau BufRead,BufNewFile /etc/nginx/* if &ft == '' | setfiletype nginx | endif
配置文件详解:
Nginx的代码是由一个核心和一系列的模块组成, 核心主要用于提供Web Server的基本功能,以及Web和Mail反向代理的功能;还用于启用网络协议,创建必要的运行时环境以及确保不同的模块之间平滑地进行交互。不过,大多跟协议相关的功能和某应用特有的功能都是由nginx的模块实现的。这些功能模块大致可以分为事件模块、阶段性处理器、输出过滤器、变量处理器、协议、upstream和负载均衡几个类别,这些共同组成了nginx的http功能。事件模块主要用于提供OS独立的(不同操作系统的事件机制有所不同)事件通知机制如kqueue或epoll等。协议模块则负责实现nginx通过http、tls/ssl、smtp、pop3以及imap与对应的客户端建立会话。
Nginx的核心模块为Main和Events,此外还包括标准HTTP模块、可选HTTP模块和邮件模块,其还可以支持诸多第三方模块。Main用于配置错误日志、进程及权限等相关的参数,Events用于配置IO模型,如epoll、kqueue、select或poll等,它们是必备模块。
Nginx的主配置文件由几个段组成,这个段通常也被称为nginx的上下文,每个段的定义格式如下所示。需要注意的是,其每一个指令都必须使用分号(;)结束,否则为语法错误。
正常运行的必备配置:
1、user USERNAME [GROUPNAME]; //:指定运行worker进程的用户和组;2、pid /PATH/TO/PIDFILE_NAME; //:指定nginx的pid文件;3、worker_rlimit_nofile #; //:指定一个worker进程所能够打开的最大文件句柄数;4、worker_rlimit_sigpending #; //:设定每个用户能够发往worker进程的信号的数量;
优化性能相关的配置:
1、worker_processes #; //:worker进程的个数;通常其数值应该为CPU的物理核心数减1;2、worker_cpu_affinity CPUMASK …; //:CPU掩码;例如:worker_processes 6; worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000; 3、ssl_engine DEVICE; //:在存在ssl硬件加速器的服务器上,指定所使用的ssl硬件加速设备;4、timer_resolution TIME; //:每次内核事件调用返回时,都会使用gettimeofday()来更新nginx缓存时钟;timer_resolution用于定义每隔多久才会由gettimeofday()更新一次缓存时钟;x86-64系统上,gettimeofday()代价已经很小,可以忽略此配置;5、worker_priority NICE; //:nice值,-20~19之间的值;
事件相关的配置
1、accept_mutex [on|off]; //:是否打开ningx的负载均衡锁;此锁能够让多个worker进轮流地、序列化地与新的客户端建立连接;而通常当一个worker进程的负载达到其上限的7/8,master就尽可能不再将请求调度此worker;2、lock_file /PATH/TO/LOCK_FILE; //:lock文件;3、accept_mutex_delay #MS; //:accept锁模式中,一个worker进程为取得accept锁的等待时长;如果某worker进程在某次试图取得锁时失败了,至少要等待#ms才能再一次请求锁;默认为500ms;4、multi_accept on|off; //:是否允许一次性地响应多个用户请求(并发连接);默认为Off; 5、use [epoll|rtsig|select|poll]; //:定义使用的事件模型,建议让nginx自动选择;6、worker_connections #; //:每个worker能够并发响应最大请求数;
用于调试、定位问题:只调试nginx时使用
1、daemon on|off; //:是否让ningx运行后台;默认为on,调试时可以设置为off,使得所有信息去接输出控制台;2、master_process on|off; //:是否以master/worker模式运行nginx;默认为on;调试时可设置off以方便追踪;3、error_log /PATH/TO/ERROR_LOG LEVEL; //:错误日志文件及其级别;默认为error级别;调试时可以使用debug级别,但要求在编译时必须使用--with-debug启用debug功能;
nginx的http web功能:
http上下文专用于配置用于http的各模块,此类指令非常的多,每个模块都有其专用指定,具体请参数nginx官方wiki关于模块部分的说明。大体上来讲,这些模块所提供的配置指令还可以分为如下几个类别。
客户端类指令:如client_body_buffer_size、client_header_buffer_size、client_header_timeout和keepalive_timeout等;
文件IO类指令:如aio、directio、open_file_cache、open_file_cache_min_uses、open_file_cache_valid和sendfile等;
hash类指令:用于定义Nginx为某特定的变量分配多大的内存空间,如types_hash_bucket_size、server_names_hash_bucket_size和variables_hash_bucket_size等;
套接字类指令:用于定义Nginx如何处理tcp套接字相关的功能,如tcp_nodelay(用于keepalive功能启用时)和tcp_nopush(用于sendfile启用时)等;
必须使用虚拟机来配置站点;每个虚拟主机使用一个server {}段配置;
server { ……}
非虚拟主机的配置或公共配置,需要定义在server之外,http之内;
http { directive value; ... server { …… } ……}
虚拟主机相关的配置:
1、server {} //:定义一个虚拟主机;nginx支持使用基于主机名或IP的虚拟主机;2、listen listen ADDRESS[:PORT]; listen PORT; default_server ; //:定义此server为http中默认的server;如果所有的server中没有任何一个listen使用此参数,那么第一个server即为默server; rcvbuf=SIZE; //:接收缓冲大小; sndbuf=SIZE; //:发送缓冲大小; ssl; //:https server;3、server_name [...]; //:server_name可以跟多个主机名,名称中可以使用通配符和正则表达式(通常以~开头);当nginx收到一个请求时,会取出其首部的server的值,而后跟众server_name进行比较;比较方式: 1)先做精确匹配;www.chencer.org 2)左侧通配符匹配;*.chencer.org 3)右侧通配符匹配;www.mas.org,www.* 4)正则表达式匹配;~^.*/.chencer/.org$4、server_name_hash_bucket_size 32|64|128; //:为了实现快速主机查找,nginx使用hash表来保存主机名;5、location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... } 功能:允许根据用户请求的URI来匹配指定的各location以进行访问配置;匹配到时,将被location块中的配置所处理;比如:http://www.chencer.org/images/logo.gif =:精确匹配; ~:正则表达式模式匹配,匹配时区分字符大小写 ~*:正则表达式模式匹配,匹配时忽略字符大小写 ^~:URI前半部分匹配,不检查正则表达式 :以指定路径逐字匹配; 匹配优先级: 字符字面量最精确匹配; 正则表达式检索(由第一个匹配到所处理); 按字符字面量;
文件路径定义:
1、root PATH; //:设置web资源路径;用于指定请求的根文档目录; location / { root /www/htdocs; } location ^~ /images/ { root /web; }2、alias PATH; //:只能用于location中,用于路径别名; location / { root /www/htdocs; } location ^~ /images/ { alias /web; }3、index FILE ...; //:定义默认页面,可参跟多个值;4、error_page code ... [=[response]] uri; //:当对于某个请求返回错误时,如果匹配上了error_page指令中设定的code,则重定向到新的URI中;即错误页面重定向;5、try_files path1 [path2 ...] uri; //:自左至右尝试读取由path所指定路径,在第一次找到即停止并返回;如果所有path均不存在,则返回最后一个uri; location ~* ^/documents/(.*)$ { root /www/htdocs; try_files $uri /docu/$1 /temp.html; }
网络连接相关的设置:
1、keepalive_timeout TIME; //:保持连接的超时时长;默认为75秒;2、keepalive_requests #; //:在一次长连接上允许承载的最大请求数;3、keepalive_disable [msie6 | safari | none ]; //:对指定的浏览器禁止使用长连接;4、tcp_nodelay on|off; //:对keepalive连接是否使用TCP_NODELAY选项;5、client_header_timeout TIME; //:读取http请求首部的超时时长;默认为60秒;6、client_body_timeout TIME; //:读取http请求包体的超时时长;默认为60秒;7、send_timeout time; //:发送响应的超时时长;
对客户端请求的限制:
1、limit_except method ... { ... }; //:指定对范围之外的其它方法的访问控制; limit_except GET { allow 192.168.0.0/24; deny all; }2、client_max_body_size SIZE; //:http请求包体的最大值;常用于限定客户所能够请求的最大包体;根据请求首部中的Content-Length(内容长度)来检测,以避免无用的传输;3、limit_rate speed; //:限制客户端每秒钟传输的字节数;默认为0,表示没有限制;4、limit_rate_after time; //:nginx向客户发送响应报文时,如果时长超出了此处指定的时长,则后续的发送过程开始限速;
文件操作的优化:
1、sendfile on|off; //:是否启用sendfile功能;2、aio on|off; //:是否启用aio功能;3、open_file_cache max=N [inactive=time]|off; //:是否打开文件缓存功能; max:缓存条目的最大值;当满了以后将根据LRU算法进行置换; inactive:某缓存条目在指定时长时没有被访问过时,将自动被删除;默认为60s; 缓存的信息包括: 文件句柄、文件大小和上次修改时间; 已经打开的目录结构; 没有找到或没有访问权限的信息;4、open_file_cache_errors on|off; //:是否缓存文件找不到或没有权限访问等相关信息;5、open_file_cache_valid time; //:多长时间检查一次缓存中的条目是否超出非活动时长,默认为60s;6、open_file_cache_min_use #; //:在inactive指定的时长内被访问超此处指定的次数地,才不会被删除;
对客户端请求的特殊处理:
1、ignore_invalid_headers on|off; //:是否忽略不合法的http首部;默认为on;off意味着请求首部中出现不合规的首部将拒绝响应;只能用于server和http;2、log_not_found on|off; //:是否将文件找不到的信息也记录进错误日志中;3、resolver ADDRESS; //:指定nginx使用的dns服务器地址;4、resover_timeout TIME; //:指定DNS解析超时时长,默认为30s; 5、server_tokens on|off; //:是否在错误页面中显示nginx的版本号;
内存及磁盘资源分配:
1、client_body_in_file_only on|clean|off; //:HTTP的包体是否存储在磁盘文件中;非off表示存储,即使包体大小为0也会创建一个磁盘文件;on表示请求结束后包体文件不会被删除,clean表示会被删除;2、client_body_in_single_buffer on|off; //:HTTP的包体是否存储在内存buffer当中;默认为off;3、cleint_body_buffer_size SIZE(8m/16m); //:nginx接收HTTP包体的内存缓冲区大小;4、client_body_temp_path dir-path [level1 [level2 [level3]]]; //:HTTP包体存放的临时目录;5、client_header_buffer_size size; //:正常情况下接收用户请求的http报文header部分时分配的buffer大小;默认为1k;6、large_client_header_buffers number size; //:存储超大Http请求首部的内存buffer大小及个数;7、connection_pool_size size; //:nginx对于每个建立成功的tcp连接都会预先分配一个内存池,此处即用于设定此内存池的初始大小;默认为256;8、request_pool_size size; //:nginx在处理每个http请求时会预先分配一个内存池,此处即用于设定此内存池的初始大小;默认为4k;
© 著作权归作者所有