一、Nginx综述
1.1 Nginx 到底是什么?
Nginx 是⼀个高性能的HTTP和反向代理web服务器,核心特点是占有内存少,并发能力强。
1.2 Nginx 应用场景
1、Http服务器(Web服务器)
性能⾮常高,⾮常注重效率,能够经受⾼负载的考验。
⽀持50000个并发连接数,不仅如此,CPU和内存的占⽤也⾮常的低,10000个没有活动的连接才占⽤2.5M的内存。
2、反向代理服务器
- 反向代理
浏览器客户端发送请求到反向代理服务器(比如Nginx),由反向代理服务器选择原始服务器提供服务获取结果响应,最终再返回给客户端浏览器。
3、负载均衡服务器
负载均衡,当⼀个请求到来的时候(结合上图),Nginx反向代理服务器根据请求去找到⼀个原始服务器来处理当前请求,那么这叫做反向代理。那么,如果⽬标服务器有多台(⽐如上图中的tomcat1,tomcat2,tomcat3…),找哪⼀个⽬标服务器来处理当前请求呢,这样⼀个寻找确定的过程就叫做负载均衡。
⽣活中也有很多这样的例⼦,比如,我们去银行,可以处理业务的窗⼝有多个,那么我们会被分配到哪个窗⼝呢到底,这样的⼀个过程就叫做负载均衡。负载均衡就是为了解决高负载的问题。
4、动静分离
1.3 Nginx 的特点
- 跨平台:Nginx可以在大多数类unix操作系统上编译运行,而且也有windows版本
- Nginx的上手非常容易,配置也比较简单
- 高并发,性能好
- 稳定性也特别好,宕机概率很低
二、Nginx核心配置文件解读
Nginx的核心配置⽂件conf/nginx.conf包含三块内容:全局块、events块、http块、server块、location块。
1、全局块
从配置⽂件开始到events块之间的内容,此处的配置影响nginx服务器整体的运行,比如worker进程的数量、错误⽇志的位置等。
每个配置选项的含义解释如下:
- user是个主模块指令,指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行。
- worker_processes是个主模块指令,指定了Nginx要开启的进程数。每个Nginx进程平均耗费10M~12M内存。建议指定和CPU的数量一致即可。
- error_log是个主模块指令,用来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。
- pid是个主模块指令,用来指定进程pid的存储文件位置。
- worker_rlimit_nofile用于绑定worker进程和CPU, Linux内核2.4以上可用。
2、events块
events块主要影响nginx服务器与⽤户的⽹络连接,⽐如worker_connections 1024,标识每个workderprocess⽀持的最⼤连接数为1024。
events事件指令是设定Nginx的工作模式及连接数上限:
-
use是个事件模块指令,用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统,epoll工作模式是首选。
-
worker_connections也是个事件模块指令,用于定义Nginx每个进程的最大连接数,默认是1024。最大客户端连接数由worker_processes和worker_connections决定,即Max_client=worker_processes*worker_connections。
在作为反向代理时,max_clients变为:max_clients = worker_processes * worker_connections/4。
进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效。
3、http块
http块是配置最频繁的部分,虚拟主机的配置,监听端⼝的配置,请求转发、反向代理、负载均衡等。
客户端指令
这一组指令用于处理客户端连接本身的各个方面以及不同类型的客户端
文件IO指令
这些指令用于控制Nginx如何投递静态文件以及如何管理文件描述符
HASH指令
这组Hash指令控制Nginx分配给某些变量多大的静态内存
SOCKET指令
Socket指令描述了Nginx如何设置创建TCP套接字的变量选项
4、server块
配置虚拟主机的相关参数,一个http中可以有多个server。
LISTEN指令
listen指令定义了一个IP地址/端口组合或者是UNIX域套接字路径
listen address[:port];
listen port;
listen unix:path;
listen指令唯一标识了在Nginx下的套接字绑定,此外还有一些其他的可选参数
SERVER_NAME指令
server_name用来表明主机名称。server name 为虚拟服务器的识别路径。因此不同的域名会通过请求头中的HOST字段(域名),匹配到特定的server块,转发到对应的应用服务器中去。
默认值:默认值为""。对于没有设置Host头字段的请求,它将会匹配该server进行处理(这种情况可用于如丢弃这种缺乏Host头的请求)。
server_name也接受通配符作为指令参数。例如:
- 匹配部分子域名:*.example.com
- 匹配部分顶级域名:www.example.*
- 一种特殊形式将匹配子域或域本身:.example(匹配*.example.com,也包括example.com)
通过在域名前面加上波浪号(~),正则表达式也可以作为参数传递给server_name。例如:
server_name ~^www\.example\.com$
#利用捕获,可以在以后引用中进一步设置(用$1、$w等)指令中使用
server_name ~^www(\d+).example\.(com)$
虚拟服务器提供请求服务的规则
在一个配置文件中可以配置多个server,当一个请求到达时,其会根据下面的规则来选择哪一个server进行服务:
1.匹配IP地址和listen指令指定的端口
2.将Host头字段作为一个字符串匹配server_name指令
3.将Host头字段与server_name指令值字符串的开始部分做匹配
4.将Host头字段与server_name指令值字符串的结尾部分做匹配
5.将Host头字段与server_name指令值进行正则表达式匹配
6.如果所有Host头匹配失败,那么将会转向listen指令标记的default_server
7.如果所有的Host头匹配失败,并且没有default_server,那么将会转向第一个server的listen指令,以满足第1步
5、location块
配置请求的路由,以及各种页面的处理情况。
location指令可以用在虚拟服务器server部分,并且意味着提供来自客户端URI或者内部重定向访问。除少数情况外,location也可以被嵌套使用,它们被作为特定的配置尽可能地处理请求。
location 语法如下:
在nginx配置⽂件中,location主要有这⼏种形式:
1)正则匹配 location ~ /lagou { }
2)不区分⼤⼩写的正则匹配 location ~* /lagou { }
3)匹配路径的前缀 location ^~ /lagou { }
4)精确匹配 location = /lagou { }
5)普通路径前缀匹配 location /lagou { }
优先级
4 > 3 > 2 > 1 > 5
alias是一个目录别名的定义,root则是最上层目录的定义
- 使用 root时,会到 root + location寻找资源 =====> ‘/’: root则可有可无
- 使用 alias时, 会到 alias后定义的目录中寻找资源 =====> alias后面必须要用 ‘/’ 结束,否则会找不到文件的
Nginx 跨域配置
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
三、Nginx应用场景之反向代理。
需求:
需求一实现
- 部署tomcat,保持默认监听8080端⼝
- 修改nginx配置,并重新加载nginx配置 ./nginx -s reload
- 测试,访问http://111.229.248.243:9003,返回tomcat的⻚⾯
需求二实现
- 再部署⼀台tomcat,保持默认监听8081端⼝
- 修改nginx配置,并重新加载
- 这⾥主要就是多location的使⽤,这⾥的nginx中server/location就好⽐tomcat中的Host/Context
四、Nginx应用场景之负载均衡
Nginx负载均衡策略
轮询
默认策略,每个请求按时间顺序逐⼀分配到不同的服务器,如果某⼀个服务器下线,能⾃动剔除
upstream lagouServer{
server 111.229.248.243:8080;
server 111.229.248.243:8082;
}
location /abc {
proxy_pass http://lagouServer/;
}
weight
weight代表权重,默认每⼀个负载的服务器都为1,权重越⾼那么被分配的请求越多(⽤于服务器性能不均衡的场景)
upstream lagouServer{
server 111.229.248.243:8080 weight=1;
server 111.229.248.243:8082 weight=2; }
ip_hash
每个请求按照ip的hash结果分配,每⼀个客户端的请求会固定分配到同⼀个⽬标服务器处理,可以解决session问题
upstream lagouServer{
ip_hash;
server 111.229.248.243:8080;
server 111.229.248.243:8082;
}
五、Nginx应用场景之动静分离
动静分离就是讲动态资源和静态资源的请求处理分配到不同的服务器上,比较经典的组合就是
Nginx+Tomcat架构(Nginx处理静态资源请求,Tomcat处理动态资源请求),那么其实之前的讲解
中,Nginx反向代理⽬标服务器Tomcat,我们能看到⽬标服务器ROOT项⽬的index.jsp,这本身就是
Tomcat在处理动态资源请求了。
所以,我们只需要配置静态资源访问即可。