什么是Nginx?
Nginx由俄罗斯程序设计师Lgor Sysoev开发,是一款高性能的HTTP和反向代理服务器软件。可以运行在UNIX、GNU/Linux、BSD以及Microsoft等操作系统中。
Nginx的优势?
Nginx与Apache相比有以下优势:在性能上,它占用很少的系统资源,能支持多的并发连接,达到更高的访问效率;在功能上,Nginx是优秀的代理服务器和负载均衡服务器;在安装配置上,Nginx安装简单、配置灵活。
什么是正向代理or反向代理?
从用途 上来讲:
正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。反向代理的典型用途是将 防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。
另外,反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。
从安全性 来讲:
正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。
反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。
Nginx的扩展功能:
基于名称和IP的虚拟主机;
支持Keepalive
支持平滑更新或升级服务器版本;
定制访问日志,支持使用日志缓冲以提高日志存储性能;
支持URL rewrite 重写;
支持路径别名;
支持基于IP及用户的访问控制
支持速率限制,支持并发数限制 ;
Nginx的扩展功能:
一个master进程,生成一个或多个worker
事件驱动:epoll,kqueue,/dev/poll(event ports)
消息通知:select,poll
支持sendfile,sendfile64
支持AIO
支持mmap
Nginx的安装方法:
1、编译安装
2、在epel源中也提供了下载包,直接下载安装即可
3、官方网站给出的地址是指向一个yum源的,我们可以将yum源指向这个链接,直接用yum安装;
4、直接在官网上获取yum源的链接地址,而后用浏览器访问指定地址,在对应网站上找到对应的包安装;
接下来编译安装Nginx:
安装版本:nginx-1.6.2.tar.gz
###安装nginx依赖环境
[[email protected] ~]# yum -y install pcre-devel #支持URL重写,但URL重写时需要用到正则表达式库,所以需要装pcre;
[[email protected] ~]# groupadd -r nginx #创建系统组 [[email protected] ~]# useradd -r -g nginx nginx #创建系统用户 [[email protected] ~]# id nginx #查看nginx用户相关信息 uid=494(nginx) gid=491(nginx) groups=491(nginx) #uid and gid都为nginx [[email protected] nginx-1.6.2]# ./configure --prefix=/usr/local/nginx \ # nginx安装目录 --conf-path=/etc/nginx/nginx.conf \ # nginx配置文件路径 --user=nginx \ # 指定启动nginx的系统用户 --group=nginx \ # 制动启动nginx的系统组 --error-log-path=/var/log/nginx/error.log \ # 错误日志文件路径 --http-log-path=/var/log/nginx/access.log \ # 访问日志路径 --pid-path=/var/run/nginx/nginx.pid \ # pid文件路径 --lock-path=/var/lock/nginx.lock \ # 锁文件路径 --with-http_ssl_module \ # 启用ssl模块 --with-http_stub_status_module \ # 启用NginxStatus功能,以监控nginx当前状态 --with-http_gzip_static_module \ # 启用gzip_static_module模块 --with-http_flv_module \ # 启用流媒体模块 --with-http_mp4_module \ # 启用mp4流媒体模块 --http-client-body-temp-path=/var/tmp/nginx/client \ # 客户端请求报文包体临时文件路径 --http-proxy-temp-path=/var/tmp/nginx/proxy \ # 报文反向代理临时文件路径 --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi \ # 报文FastCGI临时文件路径 [[email protected] nginx-1.6.2]# make && make install ##加入PATH环境变量 [[email protected] ~]# vim /etc/profile.d/nginx.sh #在里面加入如下语句 export PATH=/usr/local/nginx/sbin:$PATH [[email protected] ~]# . /etc/profile.d/nginx.sh # source一下 [[email protected] nginx-1.6.2]# nginx -t # 对nginx配置文件进行语法检查 nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: [emerg] mkdir() "/var/tmp/nginx/client" failed (2: No such file or directory) nginx: configuration file /etc/nginx/nginx.conf test failed # 从上面可以看出其配置文件的语法是OK但是,有些目录在编译安装配置nginx的时候没有自动创建,此处需要手动创建其目录 mkdir -pv /var/tmp/nginx/{client,proxy,fastcgi} # 创建目录 [[email protected] nginx-1.6.2]# nginx -t # 再进行检查 nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful # 可以看出其语法OK [[email protected] ~]# /usr/local/nginx/sbin/nginx # 启动nginx [[email protected] ~]# ss -ntl #查看80端口是否开启 ###为nginx提供Sysv服务脚本: [[email protected] init.d]# vim /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 0 nginx="/usr/local/nginx/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="/etc/nginx/nginx.conf" # 将此处改为自己编译的配置文件 [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx lockfile=/var/lock/subsys/nginx make_dirs() { # make required directories user=`nginx -V 2>&1 | grep "configure arguments:" | sed ‘s/[^*]*--user=\([^ ]*\).*/\1/g‘ -` 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 2 esac =========== [[email protected] ~]# chmod +x /etc/rc.d/init.d/nginx # 添加执行权限 # 添加至chkconfig列表中 [[email protected] init.d]# chkconfig --list nginx # 查看chkconfig列表 service nginx supports chkconfig, but is not referenced in any runlevel (run ‘chkconfig --add nginx‘) [[email protected] init.d]# chkconfig --add nginx # 添加nginx至chkconfig [[email protected] init.d]# chkconfig --list nginx nginx 0:off 1:off 2:off 3:off 4:off 5:off 6:off [[email protected] init.d]# chkconfig --level 2345 nginx on # 设定2345级别为开启 [[email protected] init.d]# chkconfig --list nginx nginx 0:off 1:off 2:on 3:on 4:on 5:on 6:off [[email protected] init.d]#service nginx start # 启动nginx服务 [[email protected] init.d]#ss -tnl # 可以看到80端口已经打开 # 测试,此时在远端浏览器中输入:http://172.16.14.1 # 如若看到nginx的欢迎信息则表明安装成功,反之没有成功。
Nginx配置文件结构
Nginx的配置文件是一个纯文本,它一般位于Nginx安装目录的conf目录下,整个配置文件是以block的形式组织的。每个block一般以一个大括号“{}”来表示,block可以分为几个层次,整个配置文件中main指令位于最高层,在main层下面可以有Events、HTTP等层级,而在HTTP层中又包含了server层,即
server block,server block中又可分为location层,并且一个server block中可以包含多个location block。
main主配置段的指令的类别: 用于调试、定位问题 正常运行必备的配置 优化性能的配置 事件相关配置 master以root身份运行,因为小于1024的端口也就是80只有root有权限启动; worker是以我们指定的用户运行 正常运行的必备配置: 1、user USERNAME [GROUPNAME]; 指定运行worker进程的用户和组,例如:user nginx nginx; 2、指定PID文件: Pid /path/to/pid_file 3、worker_rlimit_nofile #:指定一个worker进程所能够打开的最大文件句柄数; service nginx reload 重新 加载 nginx配置文件; 4、worker_rlimit_sigpending #:指定每个用户能够发往worker的信号数量; 优化性能相关的配置: 1、worker_processes #: worker线程的个数;通常应该为物理CPU核心个数减1; 2、worker_cpu_affinity cpumask ...; 绑定worker进程至指定的CPU上; CPUMASK 0001 第一颗CPU 0010 第二颗 CPU 0100 …… 1000 …… 例如:worker_cpu_affinity 00000001 00000010 00000100; 绑定时只有将CPU真正隔出来,它来的性能提升才会真的有效,就是一颗 CPU只干这一件事,别的事它一点也不干了; 3、timer_resolution t; gettimeofday(); 4、worker_priority nice; -20, 19 让worker刚启动时,让它的nice值以指定的优先级运行; nice:-20 - 19 默认都是0 ; 事件相关的配置: 1、accept_mutex [on|off] 互斥锁,能够让多个worker进程轮流 内部调度用户请求至各worker时用的负载均衡锁;打开时表示能让多个worker轮流,序列化的响应新请求 2、lock_file /path/to/lock_file: 锁文件路径 3、accept_mutex_delay #ms: 在打开内部负载均衡锁的模式时,锁是唯一的,谁拿到锁谁能接收新请求; 4、use [epoll|rgsig|select|poll]: 定义使用的事件模型:建议让Nginx自动选择: 5、worker_connections #: 每个worker进程能够响应的最大并发请求数(默认为1024个); 最大客户端由 worker_processes和worker_connections决定 :Max_client=worker_process*worker_connections 例:connections=1024 worker_process=4 最终可响应的最大并发请求数为4000+ 用于调试、定位问题:(只有调试问题时才需要使用): 1、daemon [off|on] 是否以守护进程方式启动Nginx; 2、master_process on|off: 是否以master/worker模型来运行nginx; 3、error_log /path/to/error_log level: 错误日志文件及其级别出于调试的目的,可以使用debug级别,但此级别只有在编译nginx时使用了--with-debug选项才有效; |
配置nginx做为web服务器来使用: 虚拟主机相关的配置: 1、server{ } 定义一个虚拟主机: 2、listen 监听的端口 完整格式: listen listen address[:port] [default_server] ssl backlog=number;指明TCP协议backlog队列大小。默认为 -1,表示不启用; rcvbuf=size; 指明接收缓冲大小,设定监听的句柄的SO_RCVBUF参数; ssl:当前监听的端口必须要使用ssl协议; 例如: listen 172.16.100.8:8080 3、server_name name 相当于httpd的主机名 后可跟多个主机名;名称还可以使用通配符和正则表达式 (~) ; nginx收到一个请求时,会取出报文中的hostname会跟我们定义的各个虚拟主机进行匹配 (1)先做精确匹配;www.magedu.com; (2)左侧通配符匹配,例如:*.magedu.com; (3)右侧通配符匹配,例如:www.*; (4)正则表达式匹配,例如:~^.*\.magedu\.com$ (5)default_server 如果以上都不匹配,就由这项进行匹配; server的配置格式: 例: Server { Listen 8080; Server_name www.zhangjian.com; Location / { Root "web/htdocs"; } } 此时如果导入了服务类脚本可以用: Service Service nginx reload 语法没有问题,重新加载配置文件(刚刚启动了新的监听端口,必须重启服务) Service nginx restart yum -y install Eliks 4、localtion location @name 功能:允许根据用户请求的URI来匹配定义的各Location,匹配到时,此请求将被相应的Location块中的配置所处理; 允许根据用户请求的URL来匹配location中所给定的表达式,一旦匹配,将由localtion中所给定的配置进行处理; 例: server { localtion /images{ } localtion /bbs { } localtion / } http://www.magedu.com/images 此时就被第一个location所匹配了 =:精确匹配,把用户请求的URI,与各location匹配 ~:正则表达式模式匹配,匹配时区分字符大小写 ~*:正则表达式模式匹配,不区分字符大小写 ^~:做URI的前半部分匹配,匹配时不检查正则表达式; 优先级较高 =代表精确匹配 只有在写 www.zhangjian.com/ 时才能被=号匹配 匹配优先级:精确匹配(=)、^~、~ 和 ~*、最后由不带符号的URL进行左侧匹配 当被多个location所匹配时,这些优先级还一样,就会被第一个location所匹配; 5、root 实现文件路径定义; 设置web的资源路径映射,用于指明请求的URL所对应的文档的根目录路径 可直接用于server中,也可以用于localtion段中; location /images/ { root } 以/web/imgs 为根,也就是必须在根目标下存在images目录; http://www.magedu.com/images/a.jpg 6、alias path 用于Location配置段,定义路径别名 location /images/ { alias /www/pictures/; } 把images直接映射为 /www/pictures ,在找images目录时,直接找/www/pictures即可; 回头实现一下这两个实验; 注意:root表示指明路径为对应location的 “/”URL; alias表示路径映射,即location中的 URL是相对于alias所指明的路径而言; 7、index file 默认主页面: index 8、error_page code error_page 404 =[code]:以指定的响应码进行响应;省略code表示以新资源的响应码为响应码; 例如: Server { Listen 80; Server_name www.zhangjian.com; Location / { root "/web/htdocs"; error_page 404 } location /images/ { Alias "/web/imgs/"; } } 1)可重写向成 另一个路径,也可重定向成一个URL; error_page 404 2)也可以改响应码,本来请求的不存在,我也可以给你返回一个200响应码; error_page 404 3)可以只写一个 = 会由你转向的页面的响应码做为响应码; error_page 404 9、try_files try_files path1 [,path…] 用户访问指定的URI下,如果第一个找不着就找第二个,第二个找不着就找第三个,如果都找不找就找Location所在的段; |
网络连接相关的配置: 1、keepalive_timeout 保持连接的超时时长,默认为75s; 2、keepalive_requests #: 在一次保持连接上允许承载最大资源请求数 3、keepalive_disable 为指定类型的浏览器禁用长连接 4、tcp_nodelay on|off 对长连接是否使用 TCP_NODELAY选项; 默认tcp不会把非常小的资源发送过去,要攒够更多的小报文一起发送 5、client_header_timeout time: 读取http请求报文首部的超时时长; 6、client_body_timeout 读取Httpd请求报文的body部分的超时时长; 7、send_timeout time: 发送响应报文的超时时长; 对客户端请求进行限制: 1、limit_except METHOD {…} 指定对范围之外的其它方法的访问控制; limit_except allow 172.16.0.0/16; deny all; } 如果客户端请求时使用的是 GET以外的方法,只允许172.16.0.0以外的客户端 2、client_body_max_size SIZE: 限制请求报文中body部分的上限; 通过检测请求报文首部中的"Content_Length"来判定; 3、limit_rate speed: 限制客户端每秒钟传输的字节数,默认为0表示无限制 ; 上面这些配置通常都可以用在 http http段代表全局生效,server代表主机名生效,location代表某个目录下生效; |
对内存或磁盘资源进行分配: 1、client_body_in_file_only on|clean|off; httpd请求报文的body部分是否存储在磁盘文件中 请求报文的body部分是否可暂存于磁盘;on表示允许,并且即便请求结束,也不会删除暂存内容;clean表示会删除;off表示不允许暂存; 2、client_body_in_single_buffer 请求报文的body部分,是否可以暂存在内存的buffer中,默认为off,不允许存; 如果内存空间足够用,允许存会提高性能; 3、client_body_buffer_size size; 如果允许暂存,可以暂存多大的内容; 4、client_body_temp_path DIR 如果允许暂存,可以暂存在哪个目录下,可以存在多级目录下 例如:client_body_temp_path 5、client_header_buffer_size: 请求报文header部分时,分配的内存大小 ; 正常情况下接收用户请求报文时,预留的内存空间大小 ; |
MIME类型相关的配置: 1、type { } 定义MIME types 到文件的扩展名 types { text/html .html image/jpeg .jpg } 用于说明请求的是html类型,我们就把它当text文本类型; 2、default_type 文件操作优化相关的配置: 1、sendfile on|off 有可能支持的单个文件上限小,回头百度一下 2、aio on|off 在nginx内部是否启用内核级别的文件I/O性能; 3、directio 是否使用O_DIRECT选项去请求读取文件;不会在内存中缓冲,而是直接写在磁盘上,对数据来说较安全;与sendfile互斥; 4、Open_file_cache max=N[inactive=time] | off: 是否开启缓存空间 缓存空间最大有多大; nginx可以缓存以下三种信息: (1)文件句柄、文件大小和最近一次修改时间 (2)打开目录的目录结构; (3)没有找到的或者没有权限操作的文件的相关信息 max=N 表示可缓存的最大条目上限;一旦到达上限,则会使用LRU,最近最少使用算法;从缓存中删除最近最少使用的条目; inactive=time;在由inactive指定的时长内没有被访问过的缓存条目就会被淘汰; 5、open_file_cache_errors 是否缓存在文件缓存中缓存打开文件时出现的找不到路径没有权限等的错误信息; 6、openfile_cache_min_uses 每隔多久检查一次缓存中缓存条目的有效性;默认为60秒;(太短会加大CPU负荷) 重点关注:server{},localtion{},listen,server_name,root,alias,keepalive_timeout,keepalive_requests,error_path |
基于IP的访问控制: http,server,location allow,deny 例: location /admin root /nginx/htdocs; allow 192.168.0.0/24; deny all; 基于用户的basic认证配置方法: auth_basic auth_basic_user_file nginx同样支持用 htpasswd 命令创建用户账号文件 例: rpm location /admin { root /nginx/htdocs; auth_basic "admin area" auth_basic_user_file } 此处在用 htpasswd -c -m 生成指定文件即可 基于gzip实现响应报文压压缩: 例: gzip gzip_min_length 1024k; # 允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取,默认为0,不管页面多大都进行压缩,建议设置成大于 1K的页面,小于1K的页面进行压缩会出现越压越大的情况; gzip_http_version 1.1; # 用于设置识别HTTP协议版本,默认是1.1,大部分浏览器已经支持gzip压缩,使用默认即可; gzip_vary on; # 可以让前端的缓存服务器缓存经过gzip压缩的页面 gzip_proxied expired gzip_comp_level 7; # 指定gzip压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但处理慢,较消耗CPU资源 gzip_buffers 16 gzip_type text/plain text/thml application/xml application/json application/x-javascript; # 指定压缩的类型,无论是否指定text/html类型总会被压缩 headers_module 定制响应首部: (允许我们在响应首部中自己加一段) add_header name value [always]: expires local段中: add_header X-header testheader; 首部名称 首部值 这块没有任何意义,自己随便写的 此时在用浏览器访问一次,开启调试模式,看报文首部,即可看出来结果 log_module 定制访问日志: log_format 定义日志格式 access_log 定义访问日志 格式: log_forat "‘$request" $status $bytes_sent‘ "‘$http_referer" "$http_user_agent" access_log $处使用的是 log自带的变量: commpression:日志名 remote_addr:客户端IP地址 remote_user:如果客户端登陆了,客户端的用户名 time_local:当前服务器端时间 request:用户请求的内容,请求的URL,包括整个请求符 status:状态码 bytes_sent:发送的字节数 http_referer:上一次页面,从哪跳转过来 http_user_agent: 浏览器类型 gzip_ratio:压缩比 buffer:缓存大小 flush=time:每隔多长时间从内存中刷到磁盘上一次,写的时间越长发生磁盘I/O的调用越少,性能越好,但是万一崩溃了丢失的量也越多; 如果不定义它也有默认格式,但是将来可能会经常需要定义成与 httpd的combined格式相同的格式; combined是一种常用的日志格式; |