nginx 入门
1、什么是nginx?
nginx是一个高性能的HTTP和反向代理服务器,特点如下:
- 占用内存少;
- 并发能力强,报告指出能抗5w并发;
- 支持热部署,支持7*24小时工作;
2、nginx应用场景
- 反向代理
- 负载均衡
- HTTP服务器(包含动静分离)
- 限流
- 缓存
- 黑白名单
- 跨站访问
- 防盗链
3、相关概念
1)正向代理和反向代理
- 上图正向代理:需要在客户端配置代理服务器,通过代理服务器访问其他网站;正向代理在互联⽹中的使⽤主要是科学上⽹, 你想访问⾕歌但是碍于防⽕墙你只能通过 vpn服务器作为代理才能访问
- 上图反向代理:客户端无感知,只需要将请求发到代理服务器,由反向代理服务器选择目标服务器去处理对应的请求;反向代理在互联⽹中的使⽤主要是实现负载均衡. 当你访问某个⽹站的时候, 反向代理服务器会从当前⽹站的所有服务器中选择⼀个空闲的服务器为你响应. ⽤于均衡每台服务器的负载率.
2)负载均衡
当请求达到一个量级,单个服务器解决不了,需要将请求分发到各个服务器上,将原来一个服务器的负载分发到多个服务器的过程;
3)动静分离
为了加快网站的解析速度,可以将动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来服务器的压力;
4、nginx的安装
1)《菜鸟教程》安装nginx。
2)安装后查看nginx配置文件是否监听80端口,命令:cat /usr/local/src/nginx-1.6.2/conf/nginx.conf
3)网页访问http://192.168.10.103/
4)如果访问不通可能是服务器端口没有放开,相关命令查看,参考《开启80端口》《防火墙相关命令》
5、nginx常用命令
说明:使用命令的时候,需要首先进入/usr/local/webserver/nginx/sbin目录下,该目录下面有nginx文件,需要在这里面执行命令才生效;
- ./nginx -v 查看nginx的版本号
- ./nginx -t 检查修改后的nginx.conf文件是否有语法错误
- ./nginx -s stop 关闭nginx
- ./nginx 开启nginx
- ./nginx -s reload 修改配置文件后,重新加载配置
6、nginx的配置文件
1)配置文件位置:/usr/local/webserver/nginx/conf.nginx.conf
2)配置文件结构
... #全局块,配置nginx整体运行的内容,如:worker_processes 1; 是nginx处理并发的数量 events { #events块,主要影响nginx服务器与用户网络的连接,如:worker_connections 1024; 是支持最大连接数 ... } http #http块,配置中最频繁的部分,代理、缓存、日志、负载均衡,动静分离,高可用等绝大多数功能和第三方模块的配置 { ... #http全局块,配置文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单连接请求数上限等 server #server块,和虚拟主机密切相关,每个server相当与一个虚拟主机 { ... #server全局块,该虚拟主机的监听配置和该虚拟主机的名称和IP配置 location [PATTERN] #location块,主要作用是基于Nginx服务器接收到的请求的字符串,对该请求进行转发、缓存、第三方等处理 { ... } location [PATTERN] { ... } } server { ... } ... #http全局块 }
7、配置示例
1)反向代理
效果:地址栏中输入192.168.200.128:80,跳转到服务器内部Tomcat(localhost:15002)
server { listen 80; #监听80端口 server_name 192.168.200.128; #访问地址 location / { root html; proxy_pass http://localhost:15002; #配置转发到的目标地址 index index.html index.htm; } }
2)反向代理2
效果:
- 访问192.168.200.128:15000/aaa/a.html ==》http://localhost:15002/aaa/a.html;
- 访问192.168.200.128:15000/bbb/a.html ==》http://localhost:15003/bbb/a.html
server { listen 15000; server_name 192.168.200.128; location ~ /aaa/ { proxy_pass http://localhost:15002; } location ~ /bbb/ { proxy_pass http://localhost:15003; } }
3)负载均衡
效果:访问http://192.168.200.128:15000/aaa/a.html会分别发送到15002和15003服务器,前提两者的访问路径相同
upstream sjnservers{ server 192.168.200.128:15002; server 192.168.200.128:15003; } server { listen 15000; server_name 192.168.200.128; location / { proxy_pass http://sjnservers; } }
说明:负载均衡策略有如下几种:
1)轮询 upstream sjnservers{ server 192.168.200.128:15002; server 192.168.200.128:15003; } 2)权重 upstream sjnservers{ server 192.168.200.128:15002 weight=5; server 192.168.200.128:15003 weight=10; } 3)ip_hash 按访问IP的hash结果分配,访问固定的服务器,可以解决session问题 upstream sjnservers{ ip_hash; server 192.168.200.128:15002; server 192.168.200.128:15003; } 4)fair(第三方)按照后端服务器的响应时间进行分配,响应时间短的优先分配 upstream sjnservers{ server 192.168.200.128:15002; server 192.168.200.128:15003; fair; }
4)动静分离
效果:当页面请求静态资源的时候(http://192.168.10.105/image/或者http://192.168.10.105/html/index.html),nginx直接转发到服务器中对应的文件。
server { listen 80; server_name 192.168.10.105; #配置网页访问地址 location /html { root /opt; index index.html index.htm; } location /image { root /opt; # 配置访问的根目录 autoindex on; #当访问上层目录的时(http://192.168.10.105/image),以目录的形式显示文件列表 } }
5)实现高可用
主从方式实现高可用,主备两台nginx,需要插件keepalived提供虚拟IP供用户访问,并监控主nginx的状态是否可用,如果出主现宕机,切换到备份nginx服务器
8、Nginx原理
Nginx会同时运行多个进程,一个主线程(master),和多个工作线程(worker),配置了缓存还会有缓存加载器进程和缓存管理进程等。所有进程都仅含有一个线程并主要通过共享内存的机制实现线程间通信。
每个worker都是独立进程,无需加锁,互相之间不会有影响,某个进程掉了不会影响其他进程;也降低了风险。
设置worker的数量和cpu的数量一致,你滚下会将每个worker进程绑定到固定的cpu上,避免切换cpu产生的额外开销。少了会浪费资源,多了会由于线程之间切换,影响cpu的效率;
win系统不支持多路复用,所以nginx安装在win可以使用,但是不能发挥出完美的性能。
9、优先级问题
1)当有相同server(server_name和listen相同)时,靠前配置先生效。
2)多个location时
- = #进⾏普通字符精确匹配,完全匹配
- ^~ #进⾏普通字符匹配,当前表⽰前缀匹配
- ~\~* #表⽰执⾏⼀个正则匹配
- #当程序使⽤精确匹配时,⼀但匹配成功,将停⽌其他匹配
- #当正则匹配成功时,会继续接下来的匹配,寻找是否还有更精准的匹配