nginx安装
centos7安装nginx - zhangyukun
nginx的常见命令
查看版本:nginx -v
启动:nginx
立即关闭:nginx -s stop
处理完请求后关闭:nginx -s quit
检查配置:nginx -t
输出配置:nginx -T
重新加载配置:nginx -s reload
下面是nginx的配置文件例子
部分配置详解和示例
main配置
worker_processes
nginx工作时候work进程数量,nginx默认是一个master process,一个 work process,work process默认是1,可以设置为和cpu线程数想等,master接受请求,然后worker通过争抢的方式获取转发任务。每个worker是一个独立进程,他们可以部分重启(reload 的时候,不停机更新配置),如果单个worker异常退出不影响别的worker正常工作。
events配置
worker_connections
单个work porcess 可以允许同时建立外部连接的数量,默认1024,可以设置的很大
worker_connections的值和两个因素有关,一是内存,二是操作系统允许进程试用的最大文件数
- 内存
每个连接数分别对应一个read_event、一个write_event事件,一个连接数大概占用232字节,2个事件总占用96字节,那么一个连接总共占用328字节,通过数学公式可以算出100000个连接数大概会占用 31M = 100000 * 328 / 1024 / 1024,当然这只是nginx启动时,connections连接数所占用的nginx。 - 进程最大可打开文件数
进程最大可打开文件数受限于操作系统,可通过 ulimit -n 命令查询,以前是1024(centos 7 默认是 1024),现在是65535。
nginx提供了worker_rlimit_nofile指令,这是除了ulimit的一种设置可用的描述符的方式。 该指令与使用ulimit对用户的设置是同样的效果。此指令的值将覆盖ulimit的值,如:worker_rlimit_nofile 20960。
nginx一个请求占用2个或者4个链接(如果是反向2代理就是4个,作为静态资源服务器就是2个)。
如果ngixn配置为worker_processes=1,worker_connections=1024,用它做反向代理服务器最多只能同时承受256个请求。
http配置
server配置例子
location配置例举
location 配置 proxy_pass 以后 root 无效。
location 转发规则
- = 精确匹配
- 前缀匹配
/
通用匹配,任何请求都会匹配到
proxy-pass 地址后面的/:proxy_pass http://192.168.100.6;地址后面没有 / 所以匹配部分会附加到转发地址后面,如果有/结尾那么匹配部分就不会附加到转发地址后面。
匹配地址后面的/: (/log )没有/,匹配的时候优先找按照目录查找,如果有就查询下面的index.html文件,如果没j有找/log文件。(/log/)有/,匹配的时候只会按照目录查找,不考虑/log文件。
- ^~ 前缀匹配;和/的前缀匹配类似,感觉就是把 ^~ 省略了
- 正则匹配
- ~ 开头表示区分大小写的正则匹配
- ~* 开头表示不区分大小写的正则匹配
-
!~
和!~*
分别为区分大小写不匹配及不区分大小写不匹配的正则
location匹配优先级
- 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他location的匹配项
- ^~和通用匹配。使用前缀匹配,不支持正则表达式,如果有多个location匹配成功的话,不会终止匹配过程,前缀匹配会找到匹配表达式最长的那个
- 如果前缀匹配找到就不会使用正则匹配。
- 前缀匹配找不到才会使用正则匹配,继续匹配正则表达式,只要有一个正则成功,则使用这个正则的location,立即返回结果,并结束解析过程
location里面 root ,alias,proxy_pass区别
他们的区别在于要不要加上匹配的部分的地址
- root 加匹配串命中部分
如下配置,匹配部份是projectNameA,如果请求的projectNameA/a,那么实际访问的是html/projectNameA/a
root是指定根目录,匹配部分作为根目录里面的子目录
- alias 不加匹配串命中部分
如下配置,匹配部份是projectNameA,如果请求的projectNameA/a,那么实际访问的是html/a
alias的是用匹配到的部分替换 alias指定的别名部分
- proxy_pass适用于反向代理
- proxy_pass 地址后面没有/,加匹配串命中部分,和root类似
如下配置,匹配部份是projectNameA,,如果请求的projectNameA/a,那么实际访问的是http://192.168.1.6/projectNameA/a
- proxy_pass 地址后面有/, 不加匹配串命中部分,和alias类似
如下配置,匹配部份是projectNameA,,如果请求的projectNameA/a,那么实际访问的是http://192.168.1.6/a
location三个位置的/
- 匹配串的斜杆 如果不写可以精确匹配文件,如果写了只能是目录,除了精确匹配单个文件的时候,别的时候没区别
建议不写 - root,alias 映射目录后面的斜杆 ,这里的斜杆写不写几乎没区别,只有匹配串和映射目录都不写斜杆,并且在alias的情况有异常
建议写,因为alias时是直接替换,如果上面有斜杆,替换后没有地址就不对了。如果清楚alias的原理建议不写。
- proxy_pass 地址后面的斜杆
没有斜杆是子目录,有斜杆是替换,根据需要选择或者不写
检查匹配的时候可以参考nginx的logs目录下 access.log 和 error.log(路径不对的时候里面有真实访问的磁盘路径),nginx日志默认没有开启,需要手动开启。
负载均衡
nginx负载均衡策略
- random 轮询默认值 ,不写就是轮询
- weight 权重
- ip_hash 客户端ip
- url-hash(三方)
- fair(三方)
- least_conn 最小链接数
- least_time 最小响应时间