不会这些东东,不敢说你会nginx?

一直以为自己很懂Nginx,不就是配置一些负载一些路由嘛,直到这次需要自己进行调试部署时才发现依然存在好多概念不清的情况,比如location匹配的几种优先级,rewrite 阶段、access 阶段以及 content 阶段的运行顺序
因为工作需要,这里主要总结我们常用的server,location模块的一些信息
先来看一下nginx配置文件的大体分区

不会这些东东,不敢说你会nginx?

文章插图
【不会这些东东,不敢说你会nginx?】 
mian全局块:
影响nginx全局的配置模块,一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等 。
events模块:
events{use epoll;worker_connections65536;}use epoll;use是个事件模块指令,用来指定Nginx的工作模式 。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll 。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在linux平台上,而kqueue用在BSD系统中 。==对于Linux系统,epoll工作模式是首选 。==在操作系统不支持这些高效模型时才使用select 。
worker_connections 65536;每一个worker进程能并发处理(发起)的最大连接数(包含与客户端或后端被代理服务器间等所有连接数) 。nginx作为反向代理服务器,计算公式 最大连接数 = worker_processes * worker_connections/4,所以这里客户端最大连接数是65536,这个可以增到到8192都没关系,看情况而定,但不能超过后面的worker_rlimit_nofile 。当nginx作为http服务器时,计算公式里面是除以2 。进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令ulimit -n 65536后worker_connections的设置才能生效 。
http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置 。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等 。
下面进入重点模块
server块
Server块: 一个server可以看作一个nginx的虚拟主机拷贝一份server段的文件如下
upstream backend {#ip_hash;#优先IP hash的规则server backend1.example.comweight=5;server backend2.example.com:8080;server backup1.example.com:8080backup;server backup2.example.com:8080backup;}server {listen9033;#虚拟机监听的端口server_namelocalhost;#匹配的域名root /data/htdocs/www;#服务器默认的网站根目录位置(html文件存放目录)index index.html index.htm index.php;#默认访问的html名称一般在root定义的路径下存放location /ftpFile {#匹配方式见下方proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;#alias/home/migu_nginx/ftpdata;}location /img/ {alias /var/www/image/;#alias会直接覆盖上面的匹配内容/img,并替换成定义内容加上截取的后缀}location /img/ {root /var/www/image;#root不会直接覆盖上面的匹配内容/img,并替换成定义内容加上截取的后缀}location匹配规则:
语法规则: location [=||*|^~] /uri/ {… }首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 /通用匹配 。当有匹配成功时候,停止匹配,按当前匹配规则处理请求 。
不会这些东东,不敢说你会nginx?

文章插图
 
值得注意的是,有一种暂不能理解的情况,但确实存在
不会这些东东,不敢说你会nginx?

文章插图
 
root和alias的区别
配置一:
location /img/ {alias /var/www/image/;}#若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件
配置二:
location /img/ {root /var/www/image;}#若按照这种配置的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件 。]比如访问链接为 /img/a/a.html则回去/var/www/image/img/a目录下找a.html
set指令
set $task_flag 0; 设置变量task_flag为0
反向代理 proxy_pass
如果一个请求过来了,比如 http:/127.0.0.1/mg/123/2.html,如果是下面这种配置,那最后的路由地址是http://apimigu/mg/123/2.html
location /mg{proxy_pass http://apimigu;}若是下面带/的这种配置,那路由后得到的地址是http://apimigu/123/2.html
location /mg{proxy_pass http://apimigu/;}所以结尾有没有/符号很重要
如果转发的和后台有多台服务器,我们可以定义一个upstream 负载均衡


推荐阅读