Ⅰ 集群和负载均衡的区别 nginx
Nginx是一个免费的,开源的,高性能的服务器和反向代理服务器软件,同时它也可以为IMAP和POP3服务器代理,以其高性能,稳定性,丰富的功能,结构简单,低资源消耗的特性换来广大运维者所喜爱。
Nginx与传统的服务器不同,不依赖线程来处理请求。相反,它使用一个更可扩展事件驱动架构(异步)。这种结构资源消耗较小,但更重要的是,可以承受较大的请求负荷。即使你不希望处理成千上万的请求,你仍然可以受益于Nginx的高性能和小的内存占用,以及其丰富的功能。
Nginx的反向代理:
反向代理指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接到客户端,此时代理服务器对外就表现为一个服务器,而此种工作模式类似于LVS-NET模型。
反向代理也可以理解为web服务器加速,它是一种通过在繁忙的web服务器和外部网络之间增加的 一个高速web缓冲服务器,用来降低实际的web服务器的负载的一种技术。反向代理是针对web服务器提高加速功能,所有外部网络要访问服务器时的所有请求都要通过它,这样反向代理服务器负责接收客户端的请求,然后到源服务器上获取内容,把内容返回给用户,并把内容保存在本地,以便日后再收到同样的信息请求时,它会将本地缓存里的内容直接发给用户,已减少后端web服务器的压力,提高响应速度。因此Nginx还具有缓存功能。
反向代理的工作流程:
1)用户通过域名发出访问请求,该域名被解析为反向代理服务器的IP地址;
2)反向代理服务器接收用户的请求;
3)反向代理服务器在本地缓存查找是否存在当前用户所请求的内容,找到则直接把内容返回给用户;
4)如果本地没有用户请求的内容,反向代理服务器会以自己的身份去后端服务器请求同样的信息内容,并把信息内容发给用户,如果信息内容是可以被缓存的,则会将该内容缓存在代理服务器的本地缓存中。
反向代理的好处:
1)解决了网站服务器对外可见的问题,提高了网站服务器的安全性;
2)节约了有限的IP地址资源,后端服务器均可使用私有IP地址与代理服务器进行通信;
3)加速了网站的访问速度,减轻了真是web服务器的负荷。
(一)、调度算法
Nginx的upstream指令用于指定proxy_pass和fastcgi_pass所使用的后端服务器,即nginx的反向代理功能,因此可以将两者结合起来使用以达到负载均衡的目的,而Nginx也支持多种调度算法:
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,则会跳过该服务器分配至下一个监控的服务器。并且它无需记录当前所有连接的状态,所以它是一种无状态调度。
2、weight
指定在轮询的基础上加上权重,weight和访问比率成正比,即用于表明后端服务器的性能好坏,若后端服务器性能较好则可将大部分请求分配给它,已实现其力所能及。
例如:
我后端服务器172.23.136.148配置:E5520*2 CPU,8G内存
后端服务器172.23.136.148配置:Xeon(TM)2.80GHz * 2,4G内存
我希望在有30个请求到达前端时,其中20个请求交给172.23.136.148处理,剩余10个请求交给172.23.136.149处理,就可做如下配置
upstream web_poll {
server 172.23.136.148 weight=10;
server 172.23.136.149 weight=5;
}
3、ip_hash
每个请求按访问ip的hash结果分配,当新的请求到达时,先将其客户端IP通过哈希算法进行哈希出一个值,在随后的请求客户端IP的哈希值只要相同,就会被分配至同一个后端服务器,该调度算法可以解决session的问题,但有时会导致分配不均即无法保证负载均衡。
例如:
upstream web_pool {
ip_hash;
server 172.23.136.148:80;
server 172.23.136.149:80;
}
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream web_pool {
server 172.23.136.148;
server 172.23.136.149;
fair;
}
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
upstream web_pool {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
每个设备的状态设置为:
1.down 表示当前的server不参与负载,用于ip_hash中
2.weight 默认为1.weight越大,负载的权重就越大。
3.max_fails 允许请求失败的次数默认为1.设为0则表示关闭该项功能,当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4.fail_timeout 在max_fails定义的失败次数后,暂停的时间。
5.backup 可以将其理解为备机,其它所有的非backup机器down或者忙的时候,才会将请求分配给backup机器。所以这台机器压力会最轻。
nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
(二)、指令的使用
1、upstream
声明一组可以被proxy_pass和fastcgi_pass引用的服务器;这些服务器可以使用不同的端口,并且也可以使用Unix Socket;也可以为服务器指定不同的权重。如:
upstream web_pool {
server coolinuz.9966.org weight=5;
server 172.23.136.148:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
2、server
语法:server name [parameters]
其中的name可以是FQDN,主机地址,端口或unix套接字;如果FQDN解析的结果为多个地址,则每个地址都会被用到。
3、proxy_pass
语法:proxy_pass URL;
该指令用于指定代理服务器的地址和URL将被映射为的URL或地址和端口。即用来指定后端服务器的地址或URL[端口]。
4、proxy_set_header
语法:proxy_set_header header value;
该指令允许重新定义和添加一些将被转移到被代理服务器的请求头部信息。
例如:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
注意:$proxy_add_x_forwarded_for包含客户端请求头中的"X-Forwarded-For",与$remote_addr用逗号分开,如果没有"X-Forwarded-For" 请求头,则$proxy_add_x_forwarded_for等于$remote_addr
顺便补上Nginx的内置变量:
$args, 请求中的参数;
$is_args, 如果已经设置$args,则该变量的值为“?”,否则为“”。
$content_length, HTTP请求信息头里的"Content-Length";
$content_type, 请求信息头里的"Content-Type";
$document_root, 针对当前请求所属的root指令设置的根目录路径;
$document_uri, 与$uri相同;
$host, 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
$limit_rate, 对连接速率的限制;
$request_method, 请求的方法,比如"GET"、"POST"等;
$remote_addr, 客户端地址;
$remote_port, 客户端端口号;
$remote_user, 客户端用户名,认证用;
$request_filename, 当前请求的文件路径名
$request_body_file, 客户端请求主体的临时文件名。
$request_uri, 请求的URI,带参数;
$query_string, 与$args相同;
$scheme, 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;
$server_protocol, 请求的协议版本,"HTTP/1.0"或"HTTP/1.1";
$server_addr, 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);
$server_name, 请求到达的服务器名;
$server_port, 请求到达的服务器端口号;
$uri, 请求的URI,可能和最初的值有不同,比如经过重定向之类的。
5、proxy_read_timeout
语法:proxy_read_timeout time;
这个指令设置Nginx与后端服务器建立连接后。等待后端服务器的响应时间
6、proxy_send_timeout
语法:roxy_send_timeout time;
该指令指定请求转移到后端服务器的超时时间。整个传输的要求时间不超过超时时间,但只有两次写操作之间。如果在此时间之后的后端服务器将不采取新的数据,然后nginx将关闭连接。
7、proxy_connect_timeout
语法:proxy_connect_timeout time;
该指令用来设置分配到后端服务器的连接超时时间。
8、proxy_buffers
语法: proxy_buffers the_number is_size;
该指令设置缓冲区的数目和大小,缺省情况下,一个缓冲区的大小和页面大小相同。
9、proxy_buffer_size
语法:proxy_buffer_size buffer_size;
代理缓冲区,该指令用于保存用用户的头部信息。
10、proxy_busy_buffers_size
语法:proxy_busy_buffers_size size;
用于当系统负载较大,缓冲区不够用时,可以申请更大的proxy_buffers
11、proxy_temp_file_write_size
语法:proxy_temp_file_write_size size;
用于指定缓存临时文件的大小
(三)、功能完善
安装配置第三方模块,实现upstream中对后端web server的健康状态检测:
模块下载地址:https://github.com/cep21/healthcheck_nginx_upstreams;模块名称:ngx_http_healthcheck_mole
安装配置方法:
1、首先解压healcheck模块到某路径下,这里假设为/tmp/healthcheck_nginx_upstreams
#tar -xvf cep21-healthcheck_nginx_upstreams-16d6ae7.tar.gz -C /tmp/healthcheck_nginx_upstreams
2、对nginx打补丁
首先解压nginx,并进入nginx源码目录:
# tar xf nginx-1.3.4.tar.gz
# cd nginx-1.0.11
# patch -p1 < /tmp/healthcheck_nginx_upstreams/nginx.patch
而后编译nginx,在执行configure时添加类似下面的选项:
--add-mole=/tmp/healthcheck_nginx_upstreams
所以,这里就使用如下命令:
# ./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_mole \
--with-http_flv_mole \
--with-http_stub_status_mole \
--with-http_gzip_static_mole \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
--with-pcre \
--add-mole=/tmp/healthcheck_nginx_upstreams
# make && make install
ngx_http_healthcheck_mole模块的使用方法:
1、此模块支持的指令有:
healthcheck_enabled
##启用此模块
healthcheck_delay
##对同一台后端服务器两次检测之间的时间间隔,单位毫秒,默认为1000;
healthcheck_timeout
##进行一次健康检测的超时时间,单位为毫秒,默认值2000;
healthcheck_failcount
##对一台后端服务器检测成功或失败多少次之后方才确定其为成功或失败,并实现启用或禁用此服务器;
healthcheck_send
##为了检测后端服务器的健康状态所发送的检测请求;如:healthcheck_send "GET /health HTTP/1.0" 'Host: coolinuz.9966.org';
healthcheck_expected
##期望从后端服务器收到的响应内容;如果未设置,则表示从后端服务器收到200状态码即为正确;
healthcheck_buffer
##健康状态检查所使用的buffer空间大小;
healthcheck_status
通过类似stub_status的方式输出检测信息,使用方法如下:
location /stat {
healthcheck_status;
}
(四)、配置与实现
配置代码如下:
http {
upstream web_pool {
server 172.23.136.148:80 weight=10;
server 172.23.136.149:80 weight=5;
healthcheck_enabled;
healthcheck_delay 1000;
healthcheck_timeout 1000;
healthcheck_failcount 2;
healthcheck_send "GET /.health HTTP/1.0";
}
server {
listen 80;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://web_pool;
proxy_connect_timeout 3;
}
location /stat {
healthcheck_status;
}
}
}
在这里设置“proxy_set_header”参数,是因为Nginx在做反向代理的时候,要代替客户端去访问服务器,所以,当请求包经过反向代理后,在代理服务器这里这个IP数据包的IP包头做了修改,最终后端web服务器得到的数据包的头部的源IP地址是代理服务器的IP地址,这样一来,后端服务器的程序给予IP的统计功能就没有任何意义,或者后端web服务器上有多个基于域名的虚拟主机时,就要通过添加Header头信息Host,用于指定请求的域名,这样后端web服务器才能识别该反向代理访问请求由哪个虚拟主机来处理。
(五)、小结
通过以上我们可以看出Nginx的配置其实是比较其他的web服务器软件是比较简单的,但是其实现的功能确实相当强大丰富的。通过Nginx的反向代理已经支持灵活的正则表达式匹配,可以实现网站的动、静分离,让动态的php等程序网页去访问php web服务器,让缓存页、图片、javascript、css、flash去访问Squid等缓存服务器或文件服务器。加之Nginx对静态内容的高性能,高并发量,Nginx作为前端代理负载均衡成为越来越多架构师的首先方案。
Ⅱ web服务器 Nginx
(1)概念
Web服务器是一台使用HTTP协议与客户机浏览器进行信息交流(因此又称为HTTP服务器)、为互联网客户提供服务(信息浏览,下载资源等)的主机。发展趋势:从HTML到XML、从有线到无线、从无声到有声
1.Linux是架设安全高效Web服务器的操作系统
架设Web服务器常见的操作系统:Windows、Linux、Unix。Linux安全性能最高,可以支持多个硬件平台,可以根据不同需求随意修改、调整与复制各种程序的源码以及发布在互联网上,网络功能比较强大。
2.目前主流服务器:Apache、 Nginx、 IIS
Unix/Linux操作系统下使用最广泛的免费HTTP服务器:Apache、Nginx。Windows(NT/2000/2003)操作系统使用ⅡS,综合使用最多的Web服务器是 IIs、Apache。
选择WEB服务器应考虑的本身特性因素有:性能、安全性、日志和统计、虚拟主机、代理服务器、缓冲服务和集成应用程序等。下面介绍目前最主流的三大web服务器:
① 大型
IIS:
微软的Internet Information Services (IIS),IIS 允许在互联网上发布信息,提供了一个图形界面的管理工具,称为Internet服务管理器,可用于监视配置和控制Internet服务。IIS是一种Web服务组件,其中包括Web服务器(网页浏览)、FTP服务器(文件传输)、NNTP服务器(新闻服务)和SMTP服务器(邮件传输),使得在网络上发布信息很容易。它提供ISAPI(Intranet Server API)作为扩展Web服务器功能的编程接口,它还提供一个Internet数据库连接器,可以实现对数据库的查询和更新。
Apache:
Apache是世界上用的最多的Web服务器,源于NCSAhttpd服务器的补丁(pache 补丁)。它的成功之处主要在于:源代码开放、有开放的开发队伍、支持跨平台的应用(可以运行在几乎所有的Unix、Windows、Linux系统平台上)、可移植性。
② 小型
nginx:
nginx的模块都是静态编译的,对fcgi的支持非常好,在处理链接的的方式上nginx支持epoll,支持通用语言接口(如:php、python、perl等),支持正向和反向代理、虚拟主机、url重写、压缩传输等。
(2)工作原理
当客户端Web浏览器连到服务器上并请求文件时,服务器将处理该请求并将文件反馈到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。Web服务器主要是处理向浏览器发送HTML以供浏览,而应用程序服务器提供访问商业逻辑的途径以供客户端应用程序使用。应用程序服务器可以管理自己的资源,例如看大门的工作(gate-keeping ties)包括安全(security),事务处理(transaction processing),资源池(resource pooling), 和消息(messaging)。就象Web服务器一样,应用程序服务器配置了多种可扩展(scalability)和容错(fault tolerance)技术。Web服务器的工作原理一般可分成如下4个步骤:
① 连接过程:是Web服务器和其浏览器之间所建立起来的一种连接。查看连接过程是否实现,用户可以找到和打开socket这个虚拟文件,这个文件的建立意味着连接过程这一步骤已经成功建立。
② 请求过程:是Web的浏览器运用socket这个文件向其服务器而提出各种请求。
③ 应答过程:是运用HTTP协议把在请求过程中所提出来的请求传输到Web的服务器,进而实施任务处理,然后运用HTTP协议把任务处理的结果传输到Web的浏览器,同时在Web的浏览器上面展示上述所请求之界面。
④ 关闭连接:是当上一个步骤--应答过程完成以后,Web服务器和其浏览器之间断开连接之过程。Web服务器上述4个步骤环环相扣、紧密相联,逻辑性比较强,可以支持多个进程、多个线程以及多个进程与多个线程相混合的技术。
Web服务器可以解析HTTP协议。当Web服务器接收到一个HTTP请求(request),会返回一个HTTP响应(response)。为了处理一个request,Web服务器可以response一个静态页面(HTML页面)或图片,进行页面跳转(redirect),或把动态响应委托给服务器端。Web服务器的代理模型非常简单。当一个request被送到Web服务器里来时,它只单纯的把request传递给可以很好的处理request的程序(服务器端脚本,如:CGI脚本,JSP脚本,servlets,ASP脚本,服务器端JavaScript等)。Web服务器仅仅提供一个可以执行服务器端程序和返回(程序所产生的)响应的环境,而不会超出职能范围。服务器端程序功能通常有:事务处理、数据库连接、和消息等。虽然Web服务器不支持事务处理或数据库连接池,但它可以配置各种策略来实现容错性、可扩展性(如:负载平衡、缓冲)。集群特征经常被误认为仅仅是应用程序服务器专有的特征。
(3)配置
如何设置默认文档;在同一台服务器上架设多个Web站点;(可以通过改变端口号)创建Web虚拟目录;
1、了解DNS主机名和IP地址。
如果此WEB服务器在Internet上,需向ISP申请和注册此服务器的DNS主机名和IP地址。如果此服务器只在企业网内使用,则在内部的DNS服务器上注册。
2、打开服务器文档,选择"端口"-"Internet端口",启用"TCP/ IP端口"。
3、选择"Internet协议",完成以下选项后,保存文档。
① 绑定主机名:
A、选择"是"则您可在"主机名"项中输入主机别名,WEB用户可用此别名替代Domino服务器名访问WEB服务器。
B、选择"否"(缺省)则不允许使用别名。
② DNS查询: 选择"是"则Domino服务器查询发送请求的WEB客户机的DNS名。
③ Domino日志文件和数据库将包含WEB客户机的DNS主机名: 选择"否"(缺省)则不查询,Domino日志文件和数据库将只包含WEB客户机的IP地址( 注意:选择"否"将提高Domino服务器性能,因为服务器不使用资源执行DNS查询 )
④ "允许HTTP客户浏览数据库":选择"是"则允许WEB用户在URL中使用OpenServer命令来显示服务器上数据库列表。选择"否"(缺省)则不允许。但即使WEB用户不能看到服务器上数据库列表,他们仍能打开有权限访问的单个数据库。
4、启动HTTP任务。在服务器控制台上,输入:loap http
小型项目
(1)概念
1、Nginx(俄罗斯程序设计师Igor Sysoev用C语言进行编写)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3/SMTP)代理服务器。
2、特点:占有内存少(在高连接并发的情况下,Nginx是Apache服务器不错的替代品,能够支持高达 50,000 个并发连接数的响应),并发能力强。
3、中国大陆使用nginx网站用户有:网络、京东、新浪、网易、腾讯、淘宝等。
4、Nginx代码完全用C语言从头写成,已经移植到许多体系结构和操作系统,包括:Linux、FreeBSD、Solaris、Mac OS X、AIX以及Microsoft Windows。
5、Nginx有自己的函数库,并且除了zlib、PCRE和OpenSSL之外,标准模块只使用系统C库函数。而且,如果不需要或者考虑到潜在的授权冲突,可以不使用这些第三方库。
(2)安装
官网:http://nginx.org/
选择要安装的版本:
(3)使用
打开conf/nginx.conf,修改端口号,和主页根地址为:打包后index.html的目录
模拟域名配置(本地域名设置):
在浏览器地址栏输入配置好的“域名:端口号”回车:
Ⅲ 请教问题nginx反向代理proxy
一、反向代理:Web服务器的“经纪人”
1.1 反向代理初印象
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
Nginx搭建反向代理服务器过程详解
从上图可以看出:反向代理服务器位于网站机房,代理网站Web服务器接收Http请求,对请求进行转发。
1.2 反向代理的作用
①保护网站安全:任何来自Internet的请求都必须先经过代理服务器;
Nginx搭建反向代理服务器过程详解
②通过配置缓存功能加速Web请求:可以缓存真实Web服务器上的某些静态资源,减轻真实Web服务器的负载压力;
Nginx搭建反向代理服务器过程详解
③实现负载均衡:充当负载均衡服务器均衡地分发请求,平衡集群中各个服务器的负载压力;
Nginx搭建反向代理服务器过程详解
二、初识Nginx:简单却不平凡
2.1 Nginx是神马?
Nginx搭建反向代理服务器过程详解
Nginx是一款轻量级的网页服务器、反向代理器以及电子邮件代理服务器。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
Source:Nginx(发音同engine x),它是由俄罗斯程序员Igor Sysoev所开发的。起初是供俄国大型的门户网站及搜索引擎Rambler(俄语:Рамблер)使用。此软件BSD-like协议下发行,可以在UNIX、GNU/Linux、BSD、Mac OS X、Solaris,以及Microsoft Windows等操作系统中运行。
说到Web服务器,Apache服务器和IIS服务器是两大巨头;但是运行速度更快、更灵活的对手:Nginx 正在迎头赶上。
2.2 Nginx的应用现状
Nginx 已经在俄罗斯最大的门户网站── Rambler Media(www.rambler.ru)上运行了3年时间,同时俄罗斯超过20%的虚拟主机平台采用Nginx作为反向代理服务器。
Nginx搭建反向代理服务器过程详解Nginx搭建反向代理服务器过程详解Nginx搭建反向代理服务器过程详解Nginx搭建反向代理服务器过程详解Nginx搭建反向代理服务器过程详解
在国内,已经有 淘宝、新浪博客、新浪播客、网易新闻、六间房、56.com、Discuz!、水木社区、豆瓣、YUPOO、海内、迅雷在线 等多家网站使用 Nginx 作为Web服务器或反向代理服务器。
2.3 Nginx的核心特点
(1)跨平台:Nginx 可以在大多数 Unix like OS编译运行,而且也有Windows的移植版本;
(2)配置异常简单:非常容易上手。配置风格跟程序开发一样,神一般的配置;
(3)非阻塞、高并发连接:数据复制时,磁盘I/O的第一阶段是非阻塞的。官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。(这得益于Nginx使用了最新的epoll模型);
PS:对于一个Web服务器来说,首先看一个请求的基本过程:建立连接—接收数据—发送数据,在系统底层看来 :上述过程(建立连接—接收数据—发送数据)在系统底层就是读写事件。
①如果采用阻塞调用的方式,当读写事件没有准备好时,必然不能够进行读写事件,那么久只好等待,等事件准备好了,才能进行读写事件,那么请求就会被耽搁 。
②既然没有准备好阻塞调用不行,那么采用非阻塞调用方式。非阻塞就是:事件马上返回,告诉你事件还没准备好呢,你慌什么,过会再来吧。好吧,你过一会,再来检查一下事件,直到事件准备好了为止,在这期间,你就可以先去做其它事情,然后再来看看事件好了没。虽然不阻塞了,但你得不时地过来检查一下事件的状态,你可以做更多的事情了,但带来的开销也是不小的。
(4)事件驱动:通信机制采用epoll模型,支持更大的并发连接。
①非阻塞通过不断检查事件的状态来判断是否进行读写操作,这样带来的开销很大,因此就有了异步非阻塞的事件处理机制。这种机制让你可以同时监控多个事件,调用他们是阻塞的,但可以设置超时时间,在超时时间之内,如果有事件准备好了,就返回。这种机制解决了上面阻塞调用与非阻塞调用的两个问题。
②以epoll模型为例:当事件没有准备好时,就放入epoll(队列)里面。如果有事件准备好了,那么就去处 理;如果事件返回的是EAGAIN,那么继续将其放入epoll里面。从而,只要有事件准备好了,我们就去处理它,只有当所有事件都没有准备好时,才在 epoll里面等着。这样,我们就可以并发处理大量的并发了,当然,这里的并发请求,是指未处理完的请求,线程只有一个,所以同时能处理的请求当然只有一 个了,只是在请求间进行不断地切换而已,切换也是因为异步事件未准备好,而主动让出的。这里的切换是没有任何代价,你可以理解为循环处理多个准备好的事 件,事实上就是这样的。
③与多线程方式相比,这种事件处理方式是有很大的优势的,不需要创建线程,每个请求占用的内存也很少,没有上下文切换, 事件处理非常的轻量级,并发数再多也不会导致无谓的资源浪费(上下文切换)。对于IIS服务器,每个请求会独占一个工作线程,当并发数上到几千时,就同时 有几千的线程在处理请求了。这对操作系统来说,是个不小的挑战:因为线程带来的内存占用非常大,线程的上下文切换带来的cpu开销很大,自然性能就上不 去,从而导致在高并发场景下性能下降严重。
总结:通过异步非阻塞的事件处理机制,Nginx实现由进程循环处理多个准备好的事件,从而实现高并发和轻量级。
(5)Master/Worker结构:一个master进程,生成一个或多个worker进程。
Nginx搭建反向代理服务器过程详解
PS:Master-Worker设计模式核心思想是将原来串行的逻辑并行化, 并将逻辑拆分成很多独立模块并行执行。其中主要包含两个主要组件Master和Worker,Master主要将逻辑进行拆分,拆分为互相独立的部分,同 时维护了Worker队列,将每个独立部分下发到多个Worker并行执行,Worker主要进行实际逻辑计算,并将结果返回给Master。
问:nginx采用这种进程模型有什么好处?
答:采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,Master 进程则很快重新启动新的Worker进程。当然,Worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前Worker上的所有请求失 败,不过不会影响到所有请求,所以降低了风险。
(6)内存消耗小:处理大并发的请求内存消耗非常小。在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)。
(7)内置的健康检查功能:如果 Nginx 代理的后端的某台 Web 服务器宕机了,不会影响前端访问。
(8)节省带宽:支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。
(9)稳定性高:用于反向代理,宕机的概率微乎其微。
三、构建实战:Nginx+IIS构筑Web服务器集群的负载均衡
这里我们主要在Windows环境下,通过将同一个Web网站部署到不同服务器的IIS上,再通过一个统一的Nginx反响代理服务器对外提供统一访问接入,实现一个最简化的反向代理和负载均衡服务。但是,受限于实验条件, 我们这里主要在一台计算机上进行反向代理、IIS集群的模拟,具体的实验环境如下图所示:我们将nginx服务和web网站都部署在一台计算机 上,nginx监听http80端口,而web网站分别以不同的端口号(这里是8050及8060)部署在同一个IIS服务器上,用户访问 localhost时,nginx作为反向代理将请求均衡地转发给两个IIS中不同端口的Web应用程序进行处理。虽然实验环境很简单而且有限,但是对于 一个简单的负载均衡效果而言,本文是可以达到并且展示的。
Nginx搭建反向代理服务器过程详解
3.1 准备一个ASP.NET网站部署到IIS服务器集群中
(1)在VS中新建一个ASP.NET Web应用程序,但是为了在一台计算机上展示效果,我们将这个Web程序复制一份,并修改两个Web程序的Default.aspx,让其的首页显示不同 的一点信息。这里Web1展示的是“The First Web:”,而Web2展示的则是“The Second Web”。
Nginx搭建反向代理服务器过程详解
(2)调试运行,看看两个网站的效果如何?
①Web1的展示效果:
Nginx搭建反向代理服务器过程详解
②Web2的展示效果:
Nginx搭建反向代理服务器过程详解
③部署到IIS中,分配不同的端口号:这里我选择了Web1:8050,Web2:8060
Nginx搭建反向代理服务器过程详解
(3)总结:在真实环境中,构建Web应用服务器集群的实现是将同一个Web应用程序部署到Web服务器集群中的多个Web服务器上。
3.2 下载Nginx并部署到服务器中作为自启动的Windows服务
(1)到Nginx官网下载Nginx的Windows版本:http://nginx.org/en/download.html(这里我们使用nginx/Windows-1.4.7版本进行实验,本文底部有下载地址)
(2)解压到磁盘任意目录,例如这里我解压到了:D:\Servers\nginx-1.4.7
(3)启动、停止和重新加载服务:通过cmd以守护进程方式启动nginx.exe:start nginx.exe,停止服务:nginx -s stop,重新加载配置:nginx -s reload;
Nginx搭建反向代理服务器过程详解
(4)每次以cmd方式启动Nginx服务不符合实际要求,于是我们想到将其注册为Windows服务,并设置为自动启动模式。这里,我们使用一个 不错的小程序:“Windows Service Wrapper”,将nginx.exe注册为Windows服务,具体的步凑如下:
①下载最新版的 Windows Service Wrapper 程序,比如我下载的名称是 “winsw-1.8-bin.exe”(本文底部有下载地址),然后把它命名成你想要的名字(比如: “nginx-service.exe”,当然,你也可以不改名)
②将重命名后的 nginx-service.exe 复制到 nginx 的安装目录(比如,我这里是 “D:\Servers\nginx-1.4.7″)
③在同一个目录下创建一个Windows Service Wrapper 的XML配置文件,名称必须与第一步重命名时使用的名称一致(比如我这里是 “nginx-service.xml”, 如果,你没有重命名,则应该是 “winsw-1.8-bin.xml”),这个XML的内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<service>
<id>nginx</id>
<name>Nginx Service</name>
<description>High Performance Nginx Service</description>
<executable>D:\Servers\nginx-1.4.7\nginx.exe</executable>
<logpath>D:\Servers\nginx-1.4.7\</logpath>
<logmode>roll</logmode>
<depend></depend>
<startargument>-p D:\Servers\nginx-1.4.7</startargument>
<stopargument>-p D:\Servers\nginx-1.4.7 -s stop</stopargument>
</service>
④在命令行下执行以下命令,以便将其注册成Windows服务:nginx-service.exe install
Nginx搭建反向代理服务器过程详解
⑤接下来就可以在Windows服务列表看到Nginx服务了,这里我们可以将其设置为自动启动了:
Nginx搭建反向代理服务器过程详解
(5)总结:在Windows环境中,要对外提供的Windows服务一般都要将其启动类型设置为自动。
3.3 修改Nginx核心配置文件nginx.conf
(1)进程数与每个进程的最大连接数:
?nginx进程数,建议设置为等于CPU总核心数
?单个进程最大连接数,那么该服务器的最大连接数=连接数*进程数
Nginx搭建反向代理服务器过程详解
(2)Nginx的基本配置:
?监听端口一般都为http端口:80;
?域名可以有多个,用空格隔开:例如 server_name www.ha97.com ha97.com;
Nginx搭建反向代理服务器过程详解
(3)负载均衡列表基本配置:
?location / {}:对aspx后缀的进行负载均衡请求,假如我们要对所有的aspx后缀的文件进行负载均衡时,可以这样写:location ~ .*\.aspx$ {}
?proxy_pass:请求转向自定义的服务器列表,这里我们将请求都转向标识为http://cuitccol.com的负载均衡服务器列表;
Nginx搭建反向代理服务器过程详解
?在负载均衡服务器列表的配置中,weight是权重,可以根据机器配置定义权重(如果某台服务器的硬件配置十分好,可以处理更多的请求,那么可以 为其设置一个比较高的weight;而有一台的服务器的硬件配置比较差,那么可以将前一台的weight配置为weight=2,后一台差的配置为 weight=1)。weigth参数表示权值,权值越高被分配到的几率越大;
Nginx搭建反向代理服务器过程详解
(4)总结:最基本的Nginx配置差不多就是上面这些内容,当然仅仅是最基础的配置。(详细的配置内容请下载底部的nginx-1.4.7详细查看)
3.4 添加Nginx对于静态文件的缓存配置
为了提高响应速度,减轻真实服务器的负载,对于静态资源我们可以在反向代理服务器中进行缓存,这也是反向代理服务器的一个重要的作用。
(1)缓存静态资源之图片文件
root /nginx-1.4.7/staticresources/image:对于配置中提到的jpg/png等文件均定为到/nginx-1.4.7/staticresources/image文件夹中进行寻找匹配并将文件返回;
expires 7d:过期时效为7天,静态文件不怎么更新,过期时效可以设大一点,如果频繁更新,则可以设置得小一点;
TIPS:下面的样式、脚本缓存配置同这里一样,只是定位的文件夹不一样而已,不再赘述。
Nginx搭建反向代理服务器过程详解
(2)缓存静态资源之样式文件
Nginx搭建反向代理服务器过程详解
(3)缓存静态资源之脚本文件
Nginx搭建反向代理服务器过程详解
(4)在nginx服务文件夹中创建静态资源文件夹,并要缓存的静态文件拷贝进去:这里我主要将Web程序中用到的image、css以及js文件拷贝了进去;
Nginx搭建反向代理服务器过程详解
(5)总结:通过配置静态文件的缓存设置,对于这些静态文件的请求可以直接从反向代理服务器中直接返回,而无需再将这些静态资源请求转发到具体的Web服务器进行处理了,可以提高响应速度,减轻真实Web服务器的负载压力。
3.5 简单测试Nginx反向代理实现负载均衡效果
(1)第一次访问http://localhost/Default.aspx时从127.0.0.1:8050处理响应返回结果
(2)第二次访问http://localhost/Default.aspx时从127.0.0.1:8060处理响应返回结果
(3)多次访问http://localhost/Default.aspx时的截屏:
Nginx搭建反向代理服务器过程详解
学习小结
在本文中,借助了Nginx这个神器简单地在Windows环境下搭建了一个反向代理服务,并模拟了一个IIS服务器集群的负载均衡效果。从这个 DEMO中,我们可以简单地感受到反向代理为我们所做的事情,并体会负载均衡是怎么一回事。但是,在目前大多数的应用中,都会将Nginx部署在 Linux服务器中,并且会做一些针对负载均衡的优化配置,这里我们所做的仅仅就是一个小小的使用而已(just修改一下配置文件)。不过,万丈高楼平地 起,前期的小小体会,也会帮助我们向后期的深入学习奠定一点点的基础。
突然在QQ空间里看到了朋友送的礼物,猛然发现今天居然是我的阳历生日,好吧,我祝我自己生日快乐,希望自己在未来的日子中能够做更多的实践,分享更多的内容。当然,如果你觉得本文还可以,那也麻烦点个赞,不要吝啬你的鼠标左键哟。
Ⅳ 转载:反向代理服务器nginx-proxy-manager
什么是 Nginx Proxy Manager ?
Nginx Proxy Manager 是用于管理 Nginx 代理主机的 Docker 容器,具有简单、强大的界面。它使您可以轻松地转发到您在家里或其他地方运行的网站,包括免费的 SSL,而无需对 Nginx 或 Letsencrypt 了解太多。
通过 phpMyAdmin 在 MariaDB 10 中新建用户 npm ,创建同名的库 npm 并授予所有权限。
在注册表中搜索 nginx-proxy-manager ,选择第一个 jc21/nginx-proxy-manager,版本选择 latest。
在 docker 文件夹中,创建一个新文件夹,并将其命名为 npm,再建 2 个子目录,分别命名为 data 和 letsencrypt
端口
端口不冲突就行,不确定的话可以用命令查一下
在浏览器中输入 http://群晖IP:2081 就能看到主界面
默认的账号: [email protected] ,密码:changeme
登录后可以编辑用户信息
之后是密码
进入主菜单的 SSL Certificates
Add SSL Certificate 有两种方式,一种是在线申请,另一种是添加已有证书
在线申请和我们在‘ 免费的泛域名https证书自动续期 ’一文中介绍的非常类似,需要选择 DNS 解析服务提供商,以及填写 token 等参数
老苏因为已经配置了 Certbot 并实现了自动续期,所以只需要导入现有证书就可以了,Name 老苏用了域名,这样比较容易识别
上传成功后,证书存放在 /data/custom_ssl/ 目录中以 npm-1 、 npm-2 等子目录保存
进入主菜单的 Hosts
以将 http://192.168.0.197:5000 映射到 https://nas.laosu.ml 为例
因为准备用 https 协议访问,所以必须勾选 Force SSL
其他的 HTTP/2 和 HSTS 和群晖内置的是一样的,可根据需要勾选,没啥问题的话老苏建议都勾上
为什么要另外安装 nginx proxy manager 而不是用群晖内置的反向代理的原因,老苏在一开始就讲了,装完之后老苏还发现了几个优点:
Ⅳ Nginx 最全操作——nginx反向代理(5)
将 NGINX 配置为 HTTP 和其他协议的反向代理,支持修改请求标头和微调的响应缓冲。
本文介绍代理服务器的基本配置。您将学习如何通过不同的协议将请求从 NGINX 传递到代理服务器,修改发送到代理服务器的客户端请求标头,以及配置来自代理服务器的响应的缓冲。
代理通常用于在多个服务器之间分配负载,无缝显示来自不同网站的内容,或通过 HTTP 以外的协议将处理请求传递给应用程序服务器。
当 NGINX 代理请求时,它会将请求发送到指定的代理服务器,获取响应,然后将请求发送回客户端。可以使用指定的协议将请求代理到 HTTP 服务器(另一个 NGINX 服务器或任何其他服务器)或非 HTTP 服务器(可以运行使用特定框架开发的应用程序,例如 PHP 或 Python)。支持的协议包括FastCGI、uwsgi、SCGI和memcached。
要将请求传递给 HTTP 代理服务器,需要在location中指定proxy_pass指令。例如:
此示例配置导致将在此位置处理的所有请求传递到指定地址的代理服务器。此地址可以指定为域名或者 IP 地址。该地址还可能包括一个端口:
注意,在上面的第一个例子中,代理的服务器的地址后面是一个URI, /link/ 。如果 URI 与地址一起指定,它将替换请求 URI 中与 location 参数匹配的部分。例如,这里带有 /some/path/page.html URI的请求将被代理到 http://www.example.com/link/page.html . 如果指定的地址没有问题 URI,或者无法确定要替换的 URI 部分,则传递完整的请求 URI(可能已修改)。
要将请求传递给非 HTTP 代理服务器, **_pass 应使用适当的指令:
请注意,在这些情况下,指定地址的规则可能不同。您可能还需要将其他参数传递给服务器(有关详细信息,请参阅参考文档)。
proxy_pass指令也可以指向一组命名的服务器。在这种情况下,请求根据指定的方法在组中的服务器之间分发。
默认情况下,NGINX 重新定义代理请求中的两个 header 字段,“Host”和“Connection”,并消除值为空字符串的 header 字段。“Host”设置为 $proxy_host 变量,“Connection”设置为 close 。
要更改这些设置以及修改其他标头字段,请使用proxy_set_header指令。该指令可以在某个位置或更高位置指定。它也可以在特定的服务器上下文或http块中指定。例如:
在此配置中,“主机”字段设置为$host变量。
要防止标头字段被传递到代理服务器,请将其设置为空字符串,如下所示:
默认情况下,NGINX 缓冲来自代理服务器的响应。响应存储在内部缓冲区中,并且在收到整个响应之前不会发送到客户端。缓冲有助于优化慢速客户端的性能,如果响应从 NGINX 同步传递到客户端,这可能会浪费代理服务器的时间。但是,当启用缓冲时,NGINX 允许代理服务器快速处理响应,而 NGINX 存储响应的时间与客户端下载它们所需的时间一样长。
负责启用和禁用缓冲的指令是proxy_buffering。默认情况下,它设置为 on 并启用缓冲器。
该proxy_buffers指令控制规模和分配的请求缓冲区的数目。来自代理服务器的响应的第一部分存储在单独的缓冲区中,其大小由proxy_buffer_size指令设置。这部分通常包含一个相对较小的响应头,并且可以做得比其余响应的缓冲区小。
在以下示例中,缓冲区的默认数量增加了,并且响应的第一部分的缓冲区大小小于默认值。
如果禁用缓冲,则在从代理服务器接收响应的同时将响应同步发送到客户端。对于需要尽快开始接收响应的快速交互客户端,此行为可能是可取的。
要在特定位置禁用缓冲,请将proxy_buffering指令放在带有参数的位置 off ,如下所示:
在这种情况下,NGINX 仅使用proxy_buffer_size配置的缓冲区来存储响应的当前部分。
反向代理的一个常见用途是提供负载平衡。阅读免费的选择软件负载均衡器的五个理由电子书,了解如何通过快速部署来提高功能、性能和专注于您的应用程序。
如果您的代理服务器有多个网络接口,有时您可能需要选择特定的源 IP 地址连接到代理服务器或上游。如果 NGINX 后面的代理服务器配置为接受来自特定 IP 网络或 IP 地址范围的连接,这可能很有用。
指定proxy_bind指令和必要网络接口的 IP 地址:
IP 地址也可以用变量指定。例如, $server_addr 变量传递接受请求的网络接口的 IP 地址:
简单来说,把网络首页代理到/test路径,同时把java代理到/testapi,配置如下:
参考链接:https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
欢迎大家提出不一样的观点,我们一起讨论,
我是辣个男人,一个运维人。
Ⅵ 映射公网花生壳、PubYun、NoIP、DynDNS、Ngrok、Tunnel、localtunnel、pagekite
这篇文章花了好几天,系统地梳理出了映射公网的几种方式。虽然是针对微信开发的外网服务器来寻找解决方案,但这个知识梳
理可能会在其他地方也受益。平常我也有用TeamViewer,在搜集资料的过程中也知道了其大致工作原理。还有一些免费好用的反向代理软件,可能会在后
头派上用场。
一、映射公网的两种方式介绍
1 动态域名解析+端口映射(公网环境)
动态域名解析,俗称DDNS。目前提供这种服务的厂商还挺多,我目前知道有几家:
Oray花生壳
PubYun公云
No-IP
DynDNS
如果你对一个公网IP有权限,那就可以采用这种方式。你的路由器的WAN口就是宽带,那这种方式就适用。DDNS的作用就是将WAN口分配到IP与域名绑定在一起,访问这个域名,相当于就访问到了你的WAN口。于是你只要在路由器上做一个端口映射即可。
此种方式的局限性可能就是大部分运营商都屏蔽了80等常用端口,所以做微信开发要用到80端口的话这种方式就不大适合。
2 反向代理(内网环境)
如果你在一家公司上班,公司内部可能分了好几级的路由,就比如我,那第一种方式就走不通。写零java基础搞定微信Server_3:搭建微信
Server本地开发环境那晚弄到半夜就是这个原因。哦,我当然不是在加班。我在家里,房间用了一个二级路由,那晚真真是搞死宝宝了。
下面这两张图可以快速了解反向代理。
我们是采用本机与反向代理server组建网络(相当于一个虚拟局域网),访问反向代理server的数据都被转发到本机。
从 有简单一点的将内网映射到外网的工具吗? 这个帖子中收获良多。作者 沙渺 告诉我们:
实际上ngrok就是一种仅仅针对http单一用途的代理服务。ngrok的原理很可能并不是真正的内网穿透,而是真的老老实实的充当反向代理,承担所有实际发生的流量。
这方面的替代服务有localtunnel.me和pagekite等。
内网穿透的应用中,通讯双方必然首先对一个公网服务器主动发起连接。。。
各种相关的软件都是如此,例如TeamViewer、Oray向日葵乃至QQ远程协助等。就说这个ngrok,其实也是需要通讯双方连接ngrok中心服务器,甚至中心服务器的某些高级功能还提供付费计划对吧。
于是乎,我们映射公网的工具,除了ngrok之外,又多了 localtunnel.me 和 pagekite 。
二、反向代理的实现
1 自己创建反向代理服务
用这种方式,成本较高,需要三样东西:
服务器
代理服务端的监听转发程序
目的服务端(同时也是面向代理服务器的客户端)的主机转发程序
如果你有服务器,那自己写个转发工具应该是可以实现的。比较省力的方式是参考ngrok的源码。ngrok是应该浓墨重彩写一番,开源,自由,github上开源了V1.0版本
https://github.com/inconshreveable/ngrok/
一个在自己VPS搭建ngrok的实例, https://imququ.com/post/self-hosted-ngrokd.html
很多人和我一样,现阶段就想做一个微信开发,那自己花大精力去实现一个反向代理显然不值得。这时候就得从已有的软件中进行选择。运行稳定,成了最主要考虑的因素。
2 厂商服务
Ngrok比较出名,提供免费服务,但可惜容易被墙。那解决方式就是墙内也搞Ngrok。由于我所知有限,仅仅把目前知道的几家列出来。(这里我可能先入为主了,因为我把这些厂商粗暴地分为了Ngrok和非Ngrok,忽略了其他厂商们所做出的努力。)
Ngrok
免费,但会被墙。
Tunnel
昨晚测试,访问不了。
localtunnel
可用
pagekite
可用
新花生壳
开通内网映射,映射主机即可。目前免费版也要收取8块钱的费用就是了。
NAT123
功能同花生壳,但似乎是免费的。
我贪图省事,直接花钱认证了花生壳,后面四种就没再处理了。看到别人用localtunnel和pagekite有成功的,所以我就不搬了。