Nginx与node.js

一。Nginx与Node.js

Nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能,时常用于服务端的反向代理和负载均衡。

说明:

由于工作平台和语言的原因,前端更倾向于用Nodejs来搭建服务器,进而实现一些需求。

Ngnix & Node.js各有所长:

1。Nginx更擅长于底层服务器端资源的处理(静态资源处理转发、反向代理,负载均衡等)

2。Node.js更擅长于上层具体业务逻辑的处理

Nginx + Node.js完美结合,可助力于前端开发。

Nginx应用场景

二。正向代理与反向代理

1。代理服务器

互联网应用基本都基于CS基本结构,即client端和server端。

代理其实就是在client端和真正的server端之间增加一层提供特定服务的服务器,即代理服务器。

2。正向代理

说明:

客户端和代理服务器可以直接互相访问,属于一个LAN(局域网);

代理对用户是非透明的,即用户需要自己操作或者感知得到自己的请求被发送到代理服务器;

代理服务器通过代理用户端的请求来向域外服务器请求响应内容。(该代理服务器可以访问域外服务器)

(VPN的原理大体上也类似于一个正向代理,也就是需要访问外网的电脑,发起一个访问外网的请求

通过本机上的VPN去寻找一个可以访问国外网站的代理服务器,代理服务器向外国网站发起请求,然后把结果返回给本机。)

正向代理配置

即:这样就可以做到内网中端口为8080的服务器主动请求到1.2.13.4的主机上,如在Linux下可以

正向代理关键配置

resolver:DNS服务器IP地址

listen:主动发起请求的内网服务器端口

proxy_pass:代理服务器的协议和地址

3。反向代理

说明:

代理服务器和真正server服务器可以直接互相访问,属于一个LAN(服务器内网);
代理对用户是透明的,即无感知。不论加不加这个反向代理,用户都是通过相同的请求进行,不需任何额外操作;
代理服务器通过代理内部服务器接受域外客户端的请求,并将请求发送到对应的内部服务器上(负载均衡)。
 
正向代理:代理的对象是客户端
反向代理:代理的对象是内部服务器

为什么要Nginx反向代理

(1)安全及权限

客户端无法真正访问真正的内部服务器,必须先通过Nginx代理服务器。

可在Nginx层上将危险或者没有权限的请求内容过滤掉,从而保证了服务器的安全。

(2)负载均衡

若一个网站内容被部署在N台服务器,可将这N台机器视为一个集群,Nginx可将C端请求“均匀地”分配到这个集群中所有服务器上。

实现:服务器压力的负载均衡(注:Nginx内部提供多种负载均衡算法)

另:Nginx带有健康检查功能(服务器心跳检查)

定期轮询向集群里的所有服务器发送健康检查请求,来检查集群中是否有服务器处于异常状态,一旦发现某台服务器异常,

那么在以后代理进来的C端请求都不会被发送到该服务器上(直到后面健康检查发现该服务器正常),以保证C端访问的稳定性。

实例:

一个服务器的80端口只有一个,而服务器中可能有多个项目,若: A项目端口是8081,B项目端口8082,C项目端口8083, 假设指向该服务器的域名是"identity.xx.com", 此时访问A项目是:identity.xx.com:8081 , 访问B项目是:identity.xx.com: ...... 每一个项目的URL均要加上一个端口号 此时把80端口给nginx服务器,给每个项目分配一个独立的子域名, 如A项目是a.xx.com,并且在nginx中设置每个项目的转发配置, 然后对所有项目的访问都由nginx服务器接受,然后根据配置转发给不同的服务器处理

实现代码:

反向代理的配置关键点是:

server_name:代表客户端向服务器发起请求时输入的域名

proxy_pass:代表源服务器的访问地址,也就是真正处理请求的服务器(localhost+端口号)

4。透明代理

透明代理:也叫做简单代理,意思客户端向服务端发起请求时,请求会先到达透明代理服务器,代理服务器再把请求转交给真实的源服务器处理,也就是客户端根本不知道有代理服务器的存在。

三。负载均衡

(一)负载均衡:将服务器接收到的请求按照规则分发的过程,称为负载均衡。负载均衡是反向代理的一种体现。

(二)Nginx提供的负载均衡策略有2种:内置策略和扩展策略

1。内置策略

轮询,加权轮询,Ip hash

【1】轮询算法实现

下面的配置是指:负载中有三台服务器,当请求到达时,nginx按照时间顺序把请求分配给三台服务器处理。

【2】加权轮询算法实现

【3】Ip Hash算法实现

下面的配置是指:负载中有三台服务器,当请求到达时,nginx优先按照ip_hash的结果进行分配,也就是同一个IP的请求固定在某一台服务器上,其它则按时间顺序把请求分配给三台服务器处理。

【4】url_hash

【5】fair

2。静态服务器

3。nginx安装

以linux环境为例,简述yum方式安装nginx步骤

4。扩展策略

可参照所有的负载均衡算法,给他一一找出来做下实现。(只有你想不到的,没有他-nginx做不到的)

四。web缓存

Nginx可以对不同的文件做不同的缓存处理,配置灵活,并且支持FastCGI_Cache,主要用于对FastCGI的动态程序进行缓存。

配合着第三方的ngx_cache_purge,对制定的URL缓存内容可以进行增删管理。

Nginx配置文件(nginx.conf)

五。Nginx配置文件详解

1。Nginx安装&启动:参考Nginx-Ubuntu

//ubuntu环境
su root //pwd:root //安装nginx
apt-get install nginx //所有配置文件均在/etc/nginx目录下 //启动nginx
cd /etc/init.d //进入该目录 nginx //启动脚本nginx 或 nginx start //处理端口被占用
kill -9 $(lsof -i:80) //查看所有80端口并杀掉所有占用80端口的进程 pkill -9 nginx //强制停止nginx

ubuntu安装nginx成功后,文件结构大致为:

  • 所有的配置文件都在/etc/nginx下,并且每个虚拟主机已经安排在了/etc/nginx/sites-available下
  • 程序文件在/usr/sbin/nginx
  • 日志放在了/var/log/nginx中
  • 并已经在/etc/init.d/下创建了启动脚本nginx
  • 默认的虚拟主机的目录设置在了/var/www/nginx-default (有的版本 默认的虚拟主机的目录设置在了/var/www, 请参考/etc/nginx/sites-available里的配置)

地址栏访问:http://localhost 即可显示Welcome to nginx!

虚拟主机

2。Nginx常用命令

nginx命令
//查看nginx的版本信息
nginx -v
//查看完整的nginx的配置信息
nginx -V
//查看nginx帮助选项
nginx -h
//启动nginx服务
nginx 或 nginx start
//-s选项
nginx -s stop //停止nginx服务
nginx -s reload //重新启动nginx服务
nginx -s quit //退出nginx服务
nginx -s reopen //重新打开nginx服务

3。Nginx配置文件

【1】Nginx配置文件结构

...              #全局块

events {         #events块
...
} http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}

说明:

(1)、全局块:配置影响nginx全局的指令。

一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

(2)、events块:配置影响nginx服务器或与用户的网络连接。

有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网络连接,开启多个网络连接序列化等。

(3)、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。

如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

(4)、server块:配置虚拟主机的相关参数,一个http中可以有多个server。

(5)、location块:配置请求的路由,以及各种页面的处理情况。

【2】Nginx配置文件详解CSDN

Nginx与前端结合应用场景

六。前端应用Nginx

1.快速实现简单访问控制

2.解决跨域

应用Nginx可以纯前端解决请求跨域问题。尤其前后端分离项目场景。

跨域:当前端请求URL中的:协议、域名、端口,任一与服务器URL不同,则跨域。

项目实战:(前后端分离:前端(React),后端(go/java)),前端通过浏览器调用后端,引起跨域问题。

案例描述:

前端服务地址:http://localhost:8080

后端服务地址:http://localhost:8282   因端口不一致,导致跨域!!!

解决方案:

【1】node.js服务器代理,解决跨域(跨域仅在浏览器产生,服务与服务间不存在跨域问题,可直接http请求)

//fetchData请求
return fetchData(`http://localhost:8089/http`, //代理url 8089
self.setRealNameInfo, //回调函数
{
url: `http://localhost:8282/ra/web`, //实际请求后端url 8282
type: 'get', //get请求
},
{ method: 'post', headers: { accept: 'application/json', 'cookie': document.cookie, } }).catch((ex) => { });

具体请求流程如下:

前端项目启动(8080)-》调用业务接口请求(8089)-》调用node.js代理(监听8089,允许跨域)-》发送实际URL请求,nodejs与后端(8282)建立http请求

8282后端返回数据-》node.js代理(8089)-》前端(8080)

【2】nginx反向代理

3.适配PC与移动环境

4.合并请求

5.图片处理

6.页面内容修改

Nginx相关地址:

源码:https://trac.nginx.org/nginx/browser

官网:http://www.nginx.org/

参考技术文章:

掘金:Nginx与前端开发

掘金:Nginx常用功能全揭秘

CSDN博客:Nginx配置详解

CSDN博客:nginx.conf配置文件解析

Nginx/Nginx基础学习的更多相关文章

  1. nginx的基础学习+实战

    文章目录 一.前言 二.反向代理 三.负载均衡 四.动静分离 参考视频:尚硅谷Nginx教程(2019发布) 参考链接:Windows下Nginx负载均衡实现 一.前言 Nginx (engine x ...

  2. 【Nginx】基础学习概览【汇总】

    一.Nginx 简介安装启动 二.Nginx的应用场景 三.Nginx中的配置命令 四.实现动态负载均衡 五.四层负载均衡 六.主从热备 七.动静分离 一.Nginx 简介安装启动 [Nginx]简介 ...

  3. Nginx服务器之基础学习

    一.Nginx介绍 nginx:Nginx是一种软件服务器(轻量级),故它最主要的功能就是可以与服务器硬件结合,我们的应用程序可以放在nginx服务器上进行发布,已达到让网民浏览的效果.除此自外,Ng ...

  4. Nginx基础学习(一)—Nginx的安装

    一.Nginx介绍 1.什么是Nginx?      Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.由俄罗斯的程序设计师Igor Sysoev所开 ...

  5. Nginx web基础入门

    目录 Nginx web基础入门 如何升级nginx或者添加功能 使用systemd管理nginx nginx相关配置文件 nginx的配置文件详解 日志格式 game日志记录实战 日志切割 手写虚拟 ...

  6. Linux yum的配置 , python环境管理, nginx搭建简单学习

    Linux yum的配置 , python环境管理, nginx搭建简单学习 一丶配置yum的数据仓库 ### yum 工具, 方便,自行解决软件之间的依赖关系. # 配置yum源仓库 (可以使用,清 ...

  7. Nginx Web 基础入门

    目录 Nginx Web 基础入门 Nginx快速安装 两种方式部署Nginx 如何升级nginx或者添加功能 使用systemd管理nginx nginx相关配置文件 nginx的配置文件详解 虚拟 ...

  8. nginx 的基础配置[转]

    nginx 的基础配置 分类: 工具软件2013-11-13 23:26 11人阅读 评论(0) 收藏 举报   目录(?)[-] 管理配置文件 全局配置 虚拟机server配置 location配置 ...

  9. nginx源码学习资源(不断更新)

    nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没 ...

  10. nginx源码学习资源

    http://www.cnblogs.com/yjf512/archive/2012/06/13/2548515.html nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源 ...

随机推荐

  1. Maven搭建简单的SPring+SpringMVC+Hibernate框架

    公司的项目用到的框架是Spring+SpringMVC+Hibernate 以前没有用过,所以要系统的学习一下,首先要学会怎么搭建 第一步  创建一个Maven的web项目  创建方法以前的博客中有提 ...

  2. idea+maven3.6.1构建maven工程报PKIX:unable to find valid certification path to requested target

    转载于  https://www.cnblogs.com/xiaoping1993/p/9717649.html 注意可能在idea工具执行java命令提示找不到类,返回类的最上层包路径 然后再执行j ...

  3. Python模块-requests模块使用

    写在前面 这篇文章是我照着廖雪峰python网站学习的,大致内容差不多,多了我一丢丢的自己的想法.如果发现有什么不对的话请及时联系我.qq:472668561 参考链接:https://www.lia ...

  4. vue 无缝滚动文字

    前言 用vue做无缝滚动,字体弹幕 就上代码吧 <head> <meta charset="UTF-8"> <style> div, ul, l ...

  5. 《Head First 软件开发》阅读三

    足够好的设计:以良好的设计完成工作 良好的设计有助于交付软件. 有些项目的进程会打破单一责任的原则,当每个对象只有一个理由去改变时,已经正确地实施了单一责任原则.辨别设计中的多重责任,对实现类中的东西 ...

  6. 一个IP,一个linux服务器,两个项目,两个域名;如何将两个域名配置到同一个IP的两个项目中。

    一.现有资源: 1.阿里云centOS6.5服务器: 2.安装tomcat8.0+JDK: 3.两个不同maven项目的war包,项目名分别为cloud.am: 4.两个域名http://www.lu ...

  7. scrapy中的selenium

    引入 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值.但是通过观察我们会发现 ...

  8. ERROR 1040 (08004): Too many connections

    ERROR 1040 (08004): Too many connections 长期一来,mysql低版本中,当面对连接数陡增而出现too many connections时,往往比较棘手.今天特意 ...

  9. 【NOIP2016提高A组模拟9.9】总结

    第一题,题面很不错,正解是分治,不过用ljj水法也可以轻松的所过去. 第二题,本来以为是个有向无环图, 结果搞了半天才发现,事实并不是这样的,于是暂时弃疗, 接着在最后的40分中,某人大喊:哦原来是t ...

  10. IDEA 2018.1可用License服务(持续更新)

    1. http://idea.congm.in 2.http://idea.toocruel.net