什么是Nginx?
1、Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
2、其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
3、Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好
正向代理(为用户服务----正向)
举例:用户通过代理服务器访问一个×××服务器
这里的代理服务器是为了让用户能访问到×××服务器,是为了用户服务的
反向代理(为服务器服务----反向)
举例:n个用户同时操作一个网站(高并发)
如果正向代理就是为了用户服务的,那么反向代理就是为了服务器服务的。
n个用户同时操作一个网站,为了处理同一个时间点的巨量请求,这里的代理服务器先接收所有请求,再根据算法来分配请求到具体的服务器上处理并返回响应结果,这也就是所谓的负载均衡(根据每一个服务器的具体状况合理分配请求)
在我看来:负载均衡就是反向代理带来的好处;正因为反向代理,才会有负载均衡
nginx.conf配置文件
因为某些项目中有Nginx,我初步了解了一下nginx.conf配置文件,但并不全面,以后会找时间去真正去学习Nginx.
#实现负载均衡,将“www.xuecheng.com”替换成具体的服务器ip和端口
upstream cms_server_pool{
#服务器ip和端口
server 127.0.0.1:31001 weight=10;
}
server{
listen 80;
server_name www.xuecheng.com;
ssi on;
ssi_silent_errors on;
location / {
alias F:\2020-3-15heima\UI\xc-ui-pc-s在这里插入图片描述tatic-portal/;
index index.html;
}
#页面预览
location /cms/preview/ {
proxy_pass http://cms_server_pool/cms/preview/;
}
}
#学成网媒体服务代理(允许访问的域名列表,类似于Map映射结构)
map $http_origin $origin_list{
default http://www.xuecheng.com;
"~http://www.xuecheng.com" http://www.xuecheng.com;
"~http://ucenter.xuecheng.com" http://ucenter.xuecheng.com;
}
#学成网媒体服务代理
server {
listen 80;
server_name video.xuecheng.com;
location /video {
proxy_pass http://video_server_pool;
add_header Access-Control-Allow-Origin $origin_list; //只允许 origin_list 列表下的域名才能访问该资源
#add_header Access-Control-Allow-Origin *; //任何网站可以访问该资源(服务器和服务器不用遵循同源策略)
add_header Access-Control-Allow-Credentials true; //跨域凭证
add_header Access-Control-Allow-Methods GET; //跨域方法
}
}
1、 cms_server_pool 是一个服务器池,Nginx代理服务器就是向这里的服务器分发请求的
2、weight=10 是权重,权重越大,被分发到的请求就越多
3、server 配置Nginx服务器参数
3、listen 80 Nginx占用本机的80端口
4、server_name 域名,借此可区分不同的服务
5、location:后面的字符串表示当你通过域名+字符串时,此时的请求会被Nginx代理服务器接收,再分发到服务器池中,把具体的服务器ip和端口替换掉"cms_server_pool"即可向具体的服务器提交请求了
反向代理流程
1、调用该函数
preview:function(pageId){
window.open("http://www.xuecheng.com/cms/preview/"+pageId);
}
2、根据Nginx配置文件
1、向服务器发起 http://www.xuecheng.com/cms/preview/"+pageId 请求
(注:该请求默认采用端口:80;完整写法 http://www.xuecheng.com:80/cms/preview/"+pageId)
2、因为Nginx配置文件中的服务器域名设置为 www.xuecheng.com端口是80,所以Nginx会拦截该请求
3、拦截后根据 location的字段匹配请求
4、通过cms_server_pool找到对应的连接池 cms_server_pool
5、从cms_server_pool连接池中获取的具体服务器的服务地址与ip
6、Nginx通过负载均衡算法(根据服务器性能,配置,加权等等)分发请求,将具体的服务器IP与端口嵌套到请求中来请求具体的服务器
(从cms_server_pool连接池中获取的具体服务器的服务地址与ip将之前 www.xuecheng.com:80的字段替换,所以http变成了——>http:/127.0.0.1:31001/cms/preview/"+pageId)
Nginx的流程概括来说就是:拦截——>匹配——>分发
1、拦截:根据设置好的拦截域名与端口把符合条件的请求拦截
2、匹配:匹配除了域名和端口字段后的部分uri符合则进入连接池
3、分发:从连接池中根据负载均衡算法获取服务器IP和端口进而向具体服务器请求
当然我们也可以在客户端和服务器之间设置多台nginx进行转发
补充:
一个Nginx.conf的配置文件可以配置多个server,采用不同的server name或者端口;
当你配置了多个server时,你启动nginx就会启动全部server服务,80、90、91端口与域名拦截全部生效!(并不是一个nginx.conf只能配置一个nginx服务器哦)
server{
listen 80;
server_name www.xuecheng.com;
ssi on;
ssi_silent_errors on;
location / {
alias F:/2020-3-15heima/UI/xc-ui-pc-static-portal/;
index index.html;
}
#静态资源,包括系统所需要的图片,js、css等静态资源
location /static/img/ {
alias F:/2020-3-15heima/UI/xc-ui-pc-static-portal/img/;
}
}
#学成网图片服务
server {
listen 80;
server_name img.xuecheng.com;
#个人中心
location /group1 {
proxy_pass http://img_server_pool;
}
#location /group2 {
# proxy_pass http://img_server_pool;
# }
}
#学成网媒体服务
server {
listen 90;
server_name localhost;
#视频目录
location /video/ {
alias F:/develop/video/;
}
}
拓展:
1、在网上查得Nginx对静态资源的处理速度是Tomcate服务器的6倍,所以静态资源应由具体服务器返回到Nginx代理服务器上处理返回客户端,动态资源由具体服务器返回客户端。