一、简介
nginx是轻量级、高性能的web服务器和反向代理服务器
1 | |
反向代理支持跨域,在跨域时,options 请求需要返回全部相关 header 和 204,非 option 必须返回 Access-Control-Allow-Origin 然后继续处理;origin 是请求必要的 header
1 | |
二、安装
使用包管理器安装
1 | |
使用源码安装
官网上下载源码后,解压在解压后的目录执行
1 | |
对于不同用途,建议采用不同配置
1 | |
当然,可以安装第三方模块,注意依赖关系
1 | |
三、配置指南
基本配置格式
1 | |
全局配置参数
1 | |
使用include文件
1 | |
注意这些文件要有正确的nginx语法
HTTP的server
客户端指令
1 | |
文件IO指令
1 | |
Hash指令
1 | |
socket指令
1 | |
虚拟服务器
由关键字server开始的部分都叫虚拟服务器… … 一个虚拟服务器由listen和server_name指令组合定义,listen指定定义了一个ip地址/端口组合或者是unix域套接字路径
1 | |
对于server_name,其指令相当简单
1 | |
location用于server内部,
1 | |
四、反向代理服务器
简介
Nginx 能够作为 一个反向代理来终结来自于客户端的请求,并且向上游服务器打开一个新请求
1 | |
代理模块
1 | |

1 | |
带有cookie的遗留应用程序
如果被反向代理服务器设置自己的域和路径的cookie,就要在转发这些服务器请求的时候,对域和路径进行修改
1 | |
upstream模块
一般在做反向代理服务器的时候,会使用upstream模块进行做负载均衡或者备份服务,放在http模块中
1 | |
1 | |
Keepalive
如果要实现upstream长连接,则每个进程需要另外一个connection pool,里面都是长连接。一旦与后端服务器建立连接,则在当前请求连接结束之后不会立即关闭连接,而是把用完的连接保存在一个keepalive connection pool里面,以后每次需要建立向后连接的时候,只需要从这个连接池里面找,如果找到合适的连接的话,就可以直接来用这个连接,不需要重新创建socket或者发起connect()

非HTTP型的上游服务器
memcached上游服务器
FastCGI上游服务器
SCGI
uWSGI
负载均衡
负载均衡算法
轮询、ip哈希、最少连接数
错误文件处理上游服务器问题
上游服务器无法响应请求的情况,在这些情况下,可以将 Nginx 配置为从它的本地磁盘提供一个文件。
1 | |
五、反向代理高级使用
安全隔离
使用ssl对流量进行加密
对于使用浏览器支持的ssl证书,需要付费,这里使用openssl生成一个自签ssl证书,然后进行配置
1 | |
使用ssl进行客户端身份验证
基于原始IP阻止流量
在编译时,添加GeoIP模块, –with-http_geoip_module,并且在系统中安装了MaxMind GeoIP库,在http中,使用geoip_country指令指定预编译数据库文件文职,通过国家代码,设置阻止/允许IP地址访问,
1 | |
变量$geoip_country_code的值讲被设置为ISO俩个字母的原始国家码,然后根据该变量进行控制流量了,如下示例,定义变量$exclusions,默认值是0,当ip是127.0.0.1或者属于172.29.88.0/19,则该值变为1,在之后的逻辑中,当$geoip_country_code为CH时,将$exclusions置为1,从而允许访问
1 | |
当然,可以使用键值对存储某个ip访问的频率来决定是否限制访问
反向代理服务器性能调优
缓冲数据
1 | |
平均请求大小: 800 Byte
平均响应大小: 900 Byte
proxy_buffers 240 4K
每个活动的连接是240个4KB缓冲,就是240*4*1024
假设系统能够分配给nginx的内存是768MB,就是768*1024*1024
得到nginx可以支持768*1024*1024 / 240*4*1024 = 819个活动的连接
缓存数据
1 | |
1 | |
存储数据
对于某些从来不会改变的数据,或者说长期不变的数据,没必要设置有效时间,可以直接保留在nginx服务器上,典型的比如说某些js、img、css文件。如果这些文件有更新,则需要手动上出nginx上的备份响应数据,然后才能更新
1 | |
压缩数据
压缩上游的服务器的响应能够优化带宽,提升响应速度,gzip默认启用,但是某些浏览器可能不能够响应压缩内容
1 | |
1 | |
六、Nginx HTTP服务器
nginx包含一个master进程和多个worker进程,这些进程都是单线程。master进程负责读取配置文件、处理套接字、派生woker进程、打开日志文件、编译嵌入式Perl脚本,master进程是一个可以通过处理信号响应来管理请求的进程。 worker进程运行在忙碌的时间循环处理中,用于处理进入的连接。每一个nginx模块都被构建在worker中,所以任何qingiqu处理、过滤、处理代理的连接和更多操作都在worker进程中完成。 还有少数辅助程序的nginx的master进程用于处理专门任务,cache loader负责worker进程使用缓存的元数据准备,cache manager 进程负责检查缓存条目即有效期。
HTTP核心模块
server
1 | |
日志
1 | |
查找文件
域名解析
1 | |
客户端交互
1 | |
limit
1 | |
约束访问
1 | |
1 | |
实际上,一般不会需要管理员手动编写这样一个密码文件,都是使用ldap认证方式,需要在编译nginx的时候添加nginx-auth-ldap模块。这样才能在配置时使用ldap_server配置。一个典型的配置如下
1 | |
当然,对于更为实际的情况是,当nginx用作反向代理的时候,所代理的服务一般都拥有自己一套账户系统,不需要nginx再做用户认证
1 | |
流媒体文件
在编译时添加模块 –with-http_flv_module 用于flv文件,–with-http_mp4-module 用于H.264/AAC文件。
1 | |
预定义变量
1 | |
SPDY和HTTP/2
现在对HTTP/2的支持还不够完善,所以基本上用不到。
编译时使用 --with-http_v2_module 激活对HTTP/2的支持
1 | |