Linux–Nginx攻略
什么是Nginx
Nginx (“engine x”) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的WEB服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx HTTP服务器的特色及优点
- 支持高并发:能支持几万并发连接(特别是静态小文件业务环境)
- 资源消耗少:在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB
- 可以做HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的Haproxy软件或LVS的功能
- 具备Squid等专业缓存软件等的缓存功能
- 支持异步网络I/O事件模型epoll
Nginx的主要企业功能
- 使用Nginx运行HTML,JS,CSS,小图片等静态数据(此功能类似Lighttpd软件)
- Nginx结合FastCGI运行php等动态程序(例如使用fastcgi_pass方式)
- Nginx结合Tomcat/Resin等支持Java动态程序(常用的proxy_pass)
Nginx作为web服务器的主要应用场景包括:
- 使用Nginx运行HTML,JS,CSS,小图片等静态数据(此功能类似Lighttpd软件)
- Nginx结合FastCGI运行php等动态程序(例如使用fastcgi_pass方式)
- Nginx结合Tomcat/Resin等支持Java动态程序(常用的proxy_pass)
一般情况下普通php引擎支持的并发连接参考为300-1000,Java引擎和数据库的并发连接参考值为300-1500.当然架构不同可能会有浮动
Nginx的安装
快速安装命令集合:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | yum install pcre pcre-devel –y yum install openssl openssl-devel –y useradd nginx -M -s /sbin/nologin ./configure --user=nginx --group=nginx --prefix=/application/nginx1.6.2  --with-http_stub_status_module  --with-http_ssl_module make&&make install ln -s /application/nginx1.6.2/ /application/nginx /application/nginx/sbin/nginx –t /application/nginx/sbin/nginx | 
各个命令解释
- 安装前需要安装pcre库(兼容正则表达式)
| 1 | yum install pcre pcre-devel –y | 
- 还需要安装openssl
| 1 | yum install openssl openssl-devel –y | 
- 编译之前还需要创建一个用户
| 1 | useradd nginx -M -s /sbin/nologin | 
- 编译安装:
| 1 2 3 | ./configure --user=nginx --group=nginx --prefix=/application/nginx1.6.2  --with-http_stub_status_module  --with-http_ssl_module make&&make install | 
- 安装完成后的检查与启动,重启
| 1 2 3 4 5 | /application/nginx/sbin/nginx –t /application/nginx/sbin/nginx /application/nginx/sbin/nginx –s reload | 
- 注意:1、关闭防火墙:
1/etc/init.d/iptables stop 或 service iptables stop2、关闭安全子系统(selinux) a、查看selinux的状态: 可以通过/usr/sbin/sestatus –v 或者用命令 getenforce Disabled为关闭 b、更改selinux的方式: setenforce 0(临时关闭) vi编辑/etc/selinux/config进行下面更改 SELINUX=disabled(永久关闭) 
安装故障总结
安装故障处理:
故障一:没有安装pcre或pcre-devel
报错为:./configure: error: the HTTP rewrite module requires the PCRE library.
故障二:没有安装openssl和openssl-devel
报错为:./configure: error: SSL modules require the OpenSSL library.
故障三:nginx.pid文件缺失
执行:/application/nginx1.6.2/sbin/nginx -c /application/nginx1.6.2/conf/nginx.conf
重新指定下配置文件的位置
报错为:nginx: [error] open() "/application/nginx1.6.2/logs/nginx.pid" failed (2: No such file or directory)
如果yum报错请:
http://user.qzone.qq.com/616745045/2 按照上述文档进行配置
常用的Nginx http功能模块
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Nginx http                  功能模块  模块说明 Ngx_http_core_module        包括一些核心的http参数配置,对应Nginx的配合为HTTP区块部分 Ngx_http_access_module      访问控制模块,用来控制网站用户对Nginx的访问 Ngx_http_gzip_module        压缩模块,对Nginx返回的数据压缩,属于性能优化模块 Ngx_http_fastcgi_module     FastCGI模块,和动态应用相关的模块,例如PHP Ngx_http_proxy_module       Proxy 代理模块 Ngx_http_upstream_module    负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查 Ngx_http_rewrite_module     URL地址重写模块 Ngx_http_limit_conn_module  限制用户并发连接数及请求数模块 Ngx_http_limit_req_module   根据定义的key限制Nginx请求过程的速率 Ngx_http_log_module         访问日志模块,以指定的格式记录Nginx客户访问日志等信息 Ngx_http_auth_basic_module  web认证模块,设置web用户通过账号,密码访问Nginx Ngx_http_ssl_module         ssl模块,用于加密的http连接如https Ngx_http_stub_status_module 记录Nginx基本访问状态信息等的模块 | 
nginx.conf详解
egrep -v "#|^$" nginx.conf.default >nginx.conf
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | worker_processes  1;            #worker进程的数量 event {                         #事件区块的开始 worker_connections  1024;       #每个worker进程支持的最大连接数 }                               #事件区块的结束 http {                          #http区块的开始     include       mime.types;       #nginx支持的媒体类型库文件     default_type  application/octet-stream;#默认的媒体类型     sendfile        on;             #开启高效传输模式     keepalive_timeout  65;          #连接超时     server {                        #第一个server区块开始,表示一个独虚拟主机站点         listen       80;                #服务端口,默认80         server_name  localhost;         #提供服务的域名主机名         location / {                    #第一个location区块开始         root   html;                    #站点的根目录,相当于Nginx的安装目录         index  index.html index.htm;    #默认的首页文件,如果多个用空格分开         }                               #第一个location区块结束     error_page   500 502 503 504  /50x.html;#出现对象http状态码时使用50x.html回应用户     location = /50x.html {         root   html;     }     } } | 
Location 模块
location 模块的作用是根据用户请求的URI来执行不同的应用,匹配成功了进行相关的操作
什么是统一资源标示符URI(Uniform Resource Identifier):
是一个用于标识某一互联网资源名称的字符串,该种标识允许用户对任何的资源通过特定的协议进行交互操作。URI由包括确定语法和相关协议的方案所定义。Web上可用的每种资源 HTML文档、图像、视频片段、程序等 - 由一个统一资源标识符进行定位。
Location基础语法
| 1 | location [ = | ~ | ~* | ^~ ] uri { ... } | 
6种location格式的区别
1、^~ 特殊字符串匹配 匹配到相应的字符串后,不会对后面正则进行匹配
2、~* 正则匹配 不区分大小写
3、‘=‘ 精确查找
4、/xxx/ 普通字符串路径匹配
5、/ 根 当所有匹配结束 没有符合的 匹配默认的 / 根路径
6、~ 表示uri包含正则,并且区分大小写
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | server {     listen 80;     server_name www.imdsx.cn;     location / {             return 401;     }     location = / {             return 400;     }     location ^~ /bbb/ {             return 402;     }         location ~* \.(gif|jpg|jpeg)$ {             return 403;     }         location /aaa/ {             return 502;     } } | 
实验一、输入www.imdsx.cn
nginx代理走的是精确匹配所有走到了400(这里多提一句,当多次使用的路径时 可以使用精确匹配方式,加快匹配速度提高性能)
实验二、输入http://www.imdsx.cn/123456
nginx所有location都没有匹配到找到了默认的根 也就是401
实验三、输入http://www.imdsx.cn/1.gif
nginx匹配的事正则 *.gif 也就走到了 403
组合实验
实验四、输入www.imdsx.com/aaa/1.gif
同时存在普通路径、和正则的情况下nginx又是如何匹配的呢?
nginx匹配的是正则,因为nginx在匹配时会先记录最高匹配度的普通uri,再去匹配正则,如果正则有匹配的则展示正则,否则展示普通uri
实验五、输入www.imdsx.cn/aaa/1.abc
我们输入了一个不符合正则的URI nginx匹配到了普通URI 502错误
实验五、输入www.imdsx.com/bbb/1.gif
nginx这时匹配的是402错误,^~ 方式如果匹配到普通uri后就不在继续正则匹配
重新改下location
| 1 2 3 4 5 6 | location ^ ~ / aaa / {      return 400; } location ^ ~ / aaa / bbb / {       return 401; } | 
实验六、“^~”遵循最大匹配原则
nginx匹配了 400
nginx匹配了 401
重新改下location
| 1 2 3 4 5 6 | location /aaa/ {    reutrn 400; } location = /aaa/ {    return 401; } | 
试验七、当最长匹配(^~)和精确匹配(=)相同时
nginx 匹配到了 401 匹配到了精确匹配(=)
Nginx对于静态文件的缓存配置
只要访问的是图片文件,就会根据图片的名称在image的这个目录中寻找
| 1 2 3 | location ~*.\.(jpg|gif|bmp|gif|png)$ {     root image;  # 注明我的文件存放的位置 默认以nginx的根目录算起 } | 
为什么配置静态缓存?
1、为了提高响应速度
2、减轻真实服务器的负载
对于静态资源(长久使用不变动的文件或图片)我们可以在反向代理服务器中进行缓存,nginx在跳转时只要匹配到了缓存中的文件,讲直接通过nginx返回给客户端,如果没有则在下发到个服务器进行处理。大大优化了客户的访问速度和对真是服务器所造成的真实压力
upstream模块
Upstream的牛逼之处在于,它解决了nginx跨越单机的限制,完成网络数据的接收、处理和转发。实现了负载均衡的能力。数据转发功能,为nginx提供了跨越单机的横向处理能力,使nginx摆脱只能为终端节点提供单一功能的限制,而使它具备了网路应用级别的拆分、封装和整合的战略功能。在云模型大行其道的今天,数据转发使nginx有能力构建一个网络应用的关键组件。
Upstream的四种命中机制
1、ip_hash;
iphash 能够避免同一个客户端连续的web请求分发到多个机器 涉及到session校验问题 通过iphash解决该问题
2、least_conn;
请求分发到最少连接数的服务器上
3、Round Robin(轮训)
默认是轮训机制,当有服务器down掉,就从负载列表清除掉
轮询时默认的weight=1;
4、Weight(权重)(weighted round robin)
基于权重的反向代理 weight值越大越有几率被分配
在实际应用中iphash和weight可以搭配使用
反向代理的配置设置
| 1 2 3 4 5 6 7 8 9 10 | proxy_pass http://xxxx     # 通过proxy_pass 来声明要跳转upstream设置的名字 proxy_set_header Host  $host;           # 获取通过什么域名访问的主机  proxy_set_header X-Forwarded-Fori $remote_addr; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_connect_timeout 60;               # 反向代理和后端节点服务器 链接超时时间 发起握手后的时间 proxy_send_timeout 60;                  # 后端服务器数据回传的超时时间 proxy_read_timeout 60;                  # Nginx 从后端读取数据的超时时间 proxy_buffer_size 4k;                   # 设定头部缓冲区大小 proxy_buffers 4 32k;                    # 设定缓冲的的数量和大小 proxy_busy_buffers_size 64k;            # 当系统繁忙时 可使用该缓冲区的大小 proxy_temp_file_write_size 64k;         # 临时缓存文件大小 | 
代理缓存区设置(proxy_buffering)
proxy_buffering参数
| 1 | proxy_buffering on|off | 
代理缓存的开启和关闭,不影响proxy_buffer_size的作用,只作用在proxy_buffers、proxy_busy_buffers_size
| 1 | proxy_buffer_size 4k | 
接受服务器返回的第一个部分 response header 建议设置为proxy_buffers的一个buffer的大小
| 1 | proxy_buffers 4 4k | 
设置buffer的数量和大小
| 1 | proxy_busy_buffers_size 8k | 
nginx在接受服务器的数据的同时,并不是全部接受服务器回传的数据在返回客户端而是有部分数据在接收的同时返回客户端,返回的大小通过proxy_busy_buffers_size
 设置,建议是单个buffer的两倍。如果缓冲区和busy缓冲区都满了则写到磁盘的临时文件中。通过下方的参数设置
| 1 | proxy_max_temp_file_size 1024m | 
responser返回占满了所有buffer则存在temp_file下 而最多能接收的大小则通过proxy_max_temp_file_size设置 当涉及到磁盘存储时就涉及到IO的操作,则会影响到客户端体验的效果
| 1 | proxy_temp_file_write_size 8k | 
是一次访问能写入的临时文件的大小,默认的大小单个buffer的2倍
生产中常见的网站状态码
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | 状态码 详细描述说明 200-OK                      服务器成功返回网页,这是成功的状态码 301-Moved Permanently       永久跳转,所请求的网页将永久跳转到被设定的新位置 403-Forbidden               禁止访问,虽然这个请求时合法的,但是服务器端因为匹配了预先设置的规则而拒绝相应客户端的请求,                             此类问题一般为服务器或服务器权限配置不当所致 404-Not Found               服务器找不到客户端请求的指定页面,可能是客户端请求了服务器上不存在的资源所导致 500-Internal Server Error   内部服务器错误,服务器遇到了意料不到的情况,不能完成客户的请求,                             这是一个较为笼统的报错,一般为服务器的设置或内部程序问题导致 502-Bad Gateway             坏的网关,一般是代理服务器请求后端服务时,后端服务不可用或没有完成相应网关服务器,                             这通常为反向代理服务器下面的节点出问题导致 503-Service Unavailable     服务当前不可用,可能是服务器超载或停机维护导致的,或者是反向代理没有可以提供的服务节点 504-Gateway Timeout         网关超时,一般是网关代理服务器请求后端服务时,后端服务没有在特定的时间内完成处理请求,                             多数是服务器过载导致没有在指定的时间内返回数据给前端代理服务器 | 
Linux–Nginx攻略的更多相关文章
- Linux系统攻略 用UUID在Fstab中挂载分区
		Fstab 文件大家都很熟悉,Linux 在启动的时候通过 fstab 中的信息挂载各个分区,一个典型的分区条目就像这样: /dev/sdb5 /mnt/usb vfat utf8,umask=0 0 ... 
- linux shell攻略学习笔记二
		1.Cat命令 这么多命令,常用的 Cat –n file 显示文件以及行数 Cat - echo 'Text through stdin' | cat - file.txt Text throug ... 
- linux shell攻略学习笔记一 基础篇
		1.#!/bin/bash shebang 可以自定义 比如 #!/bin/bash +x 就会打印出执行日志 linux中 \ 代表null \n2\n3” 会转义其中的\n,生成3行数据 $! 保 ... 
- shell脚本学习1(Linux脚本攻略)
		sudo <command> < arguments> 等价于root权限执行命令 赋予所有用户文件的可执行权限:chmod a+x script.sh 执行脚本:./scri ... 
- JAVA EE企业级开发四步走完全攻略 [转]
		http://bbs.51cto.com/thread-550558-1.html 本文是J2EE企业级开发四步走完全攻略索引,因内容比较广泛,涉及整个JAVA EE开发相关知识,这是一个长期的计划, ... 
- 【JAVA EE企业级开发四步走完全攻略】
		本文是J2EE企业级开发四步走完全攻略索引,因内容比较广泛,涉及整个JAVA EE开发相关知识,这是一个长期的计划,单个发blog比较零散,所以整理此索引,决定以后每发一季JAVA EE blog后会 ... 
- 极客时间-左耳听风-程序员攻略-Linux系统、内存和网络
		程序员练级攻略:Linux系统.内存和网络 Linux 系统相关 Red Hat Enterprise Linux 文档 . Linux Insides ,GitHub 上的一个开源电子书,其中讲述了 ... 
- Linux一键安装web环境全攻略phpstudy版
		此教程主要是应对阿里云Linux云服务器ecs的web环境安装,理论上不限于阿里云服务器,此教程对所有Linux云服务器都具有参考价值. 写这篇文章的目的:网上有很多关于Linux一键安装web环境全 ... 
- linux下安装apache与php;Apache+PHP+MySQL配置攻略
		1.apache 在如下页面下载apache的for Linux 的源码包 http://www.apache.org/dist/httpd/; 存至/home/xx目录,xx是自建文件 ... 
随机推荐
- plt.imshow()为什么不能显示同时显两张照片
			在编程的过程中发现plt.imshow()不能同时显示两张照片,如果有两条plt.imshow()语句处于一前一后的位置,那么程序运行后只会显示后面的图片.如果想让每一张图片都显示出来,需要在每一个p ... 
- Redis分布式锁服务
			阅读目录: 概述 分布式锁 多实例分布式锁 总结 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj = new object(); lock (ob ... 
- 动态DP总结
			动态DP 何为动态DP? 将画风正常的DP加上修改操作. 举个例子? 给你一个长度为\(n\)的数列,从中选出一些数,要求选出的数互不相邻,最大化选出的数的和. 考虑DP,状态设计为\(f[i][1/ ... 
- JavaScript toFixed()、toExponential、toPrecision方法
			JavaScript toFixed() 定义和用法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字. 语法 NumberObject.toFixed(num) 参数 描述 ... 
- WEB Fuzz中需要关注的7种响应
			WEB应用模糊测试(WEB Fuzz)是一种特殊形式的网络协议模糊测试,专门关注遵循HTTP规范的网络数据包. WEB Fuzz并不是新的概念,目前有多种WEB应用模糊测试器(WEB Fuzzer), ... 
- Java网络编程与NIO详解10:深度解读Tomcat中的NIO模型
			本文转自:http://www.sohu.com/a/203838233_827544 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 ht ... 
- 关于Java协变性的思考
			简而言之,如果A IS-A B,那么A[] IS-A B[]. 举例:现在有类型Person.Employee和Student.Employee 是一个(IS-A) Person,Student是一个 ... 
- foreach(增强for循环)和for的区别
			https://www.cnblogs.com/XiaojianGo/p/7471860.html 首先说一下foreach有的也叫增强for循环,foreach其实是for循环的一个特殊简化版. 再 ... 
- 40 insert语句的锁
			40 insert语句的锁 上一篇文章中对mysql自增主键锁做了优化,尽量在申请到自增id后,就释放自增锁. 因此,insert语句是一个很轻量的操作,不过,这个结论对于”普通的insert”才生效 ... 
- 【FICO系列】SAP FICO 基本概念
			公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[FICO系列]SAP FICO 基本概念 ... 
