Nginx是一个高性能的HTTP和反向代理的web服务器,同时也提供了IMAP/POP3/SMTP服务,Nginx是由伊戈尔·塞索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因他的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx1.0.4发布。
nginx时一款轻量级的web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like协议下发行。其特点时占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆是由nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx可以在大多数UnixLinuxOS上编译运行,并有Windows移植版,Nginx的1.4.0稳定版本已经于2013年4月24日发布,一般情况下,对于新建站点,建议是由最新稳定版本为生产版本,已有站点的升级紧迫性不高,Nginx的源代码使用2-clause BSD-like license。
Nginx 是一个很强大的高性能web和反向代理服务,它具有很多非常优越的特性:
再连接高并发的情况下,Nginx是Apache服务模型不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应。
HTTP基础功能:
-
处理静态文件,索引文件以及自动索引;
-
反向代理加速(无缓存),简单的负载均衡和容错;
-
FastCGI,简单的负载均衡和容错;
-
模块化的结构。过滤器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;
-
SSL 和 TLS SNI 支持;
IMAP/POP3 代理服务功能:
-
使用外部 HTTP 认证服务器重定向用户到 IMAP/POP3 后端;
-
使用外部 HTTP 认证服务器认证用户后连接重定向到内部的 SMTP 后端;
-
认证方法:
-
POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5;
-
IMAP: IMAP LOGIN;
-
SMTP: AUTH LOGIN PLAIN CRAM-MD5;
-
SSL 支持;
-
在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持;
其他HTTP功能:
-
基于IP 和名称的虚拟主机服务;
-
Memcached 的 GET 接口;
-
支持 keep-alive 和管道连接;
-
灵活简单的配置;
-
重新配置和在线升级而无须中断客户的工作进程;
-
可定制的访问日志,日志写入缓存,以及快捷的日志回卷;
-
4xx-5xx 错误代码重定向;
-
基于 PCRE 的 rewrite 重写模块;
-
基于客户端 IP 地址和 HTTP 基本认证的访问控制;
-
PUT, DELETE, 和 MKCOL 方法;
-
支持 FLV (Flash 视频);
-
带宽限制
明确一个概念:代理服务器: 提供代理服务的电脑系统或其他类型的网络终端,代理网络用户去获取网络信息
代理服务器的优点:
-
提高访问速度:
-
由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次客户再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到到缓存的作用,尤其对于热门网站能明显提高访问速度。
-
-
防火墙作用:
-
由于所有的客户机请求都必须通过代理服务器访问远程站点,因此可以再代理服务器上设置权限,过滤掉莫i写不安全信息。同时正向代理中上网者可以隐藏自己的ip,免受攻击。
-
-
突破访问限制
-
互联网上有许多开发的代理服务器,客户机在访问限制时,可通过不受限的代理服务器访问目标站点,通俗说,我们使用的浏览器就是利用了代理服务器,可以直接访问外网
-
正向代理(for ward proxy),一个位于客户端和原始服务器之前的服务器,为了从原始服务器取得内容,客户端项代理发送一个请求并制定目标(原始服务器),然后代理项原始服务器转发请求并将获得的内容返回给客户端。客户端才能使用正向代理。平时说的代理都时正向代理。
正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
简单一点:A向C借钱,由于一些情况不能直接向C借钱,于是A想到一个办法,他让B向C借钱,A就得到了C的钱,C不知道A的存在,B就充当于代理人的角色。
4.2 反向代理
反向代理(Reverse Proxy),以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求的客户端,此时代理服务器对外表现为一个反向代理服务器。
反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息!
简单一点:A向B借钱,B没有拿自己的钱,而是悄咪咪的向C借钱,拿到钱之后再交给A,A以为时B的钱,他并不知道C的存在。
4.3 正向代理和反向代理的区别
-
位置不同
-
正向代理:架设再客户机和目标主机之间
-
反向代理:架设再服务器端
-
-
代理对象不同
-
正向代理:代理客户端,服务器不知道实际发起请求的客户端
-
反向代理:代理服务端,客户端不知道实际提供服务的服务端;
-
-
用途不同
-
正向代理:为再防火墙内的局域网客户端提供网文Internet的途径
-
反向代理:将防火墙后面的服务器提供给Internet访问
-
-
安全性不同
-
正向代理:允许客户端通过它访问任意网站并且隐藏客户端自身,因此必须采取安全措施以确保仅为授权的客户端提供服务
-
反向代理:都说对外透明,访问者并不知道自己访问的是哪个代理
-
4.4 应用
正向代理的应用:
-
访问原来无法访问的资源
-
用作缓存,加速访问速度
-
对客户端访问授权,上网进行认证
-
代理可以记录用户的访问记录(上网行为管理),对外隐藏用户信息
反向代理的应用:
-
保护内网安全
-
负载均衡
-
缓存,减少服务器的压力
Nginx作为最近较火的反向代理服务器,安装在目的主机端,主要用于转发客户机请求,后台有多个http服务器提供服务,nginx的功能就是把请求转发给后台的服务器,决定哪台目标主机来处理当前请求。
正向代理是从客户端的角度出发,服务于特定用户(比如说一个局域网内的客户)以访问非特定的服务;反向代理正好与此相反,从服务端的角度出发,服务于非特定用户(通常是所有用户),已访问特定的服务。
5. 负载均衡
nginx扮演了反向代理服务器的角色,它是以依据什么样的规则进行请求分发的呢?不用的项目应用场景,分发的规则是否可以控制呢?
这里提到的客户端发送的、nginx反向代理服务器接收到的请求数量,就是我们说的负载量
请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则
所以,将服务器接收到的请求按照规则分发的过程,被称为负载均衡
负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如F5负载均衡,相对造价昂贵成本较高,但是数据的稳定性安全性等等有非常好的保障,如中国移动中国联通这样的公司才会选择硬负载进行操作;更多的公司考虑到成本原因,会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制
nginx支持的负载均衡调度算法方式如下:
-
weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
-
ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
-
fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块
-
url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包
6.1 windows安装
官方网站下载地址:[https://nginx.org/en/download.html]
下载对应的版本的nginx压缩包,解压到自己电脑上存放软件的文件夹中即可
1) 直接双击该目录下的nginx.exe,即可启动nginx服务器
2) 命令行计入该文件夹,执行nginx命令,也会直接启动nginx服务器 nginx
访问nginx : 打开浏览器,输入地址:http://localhost,访问页面,出现如下页面表示访问成功
停止nginx:
命令行进入nginx根目录,执行如下命令,停止服务器:
nginx -s stop
# 强制停止nginx服务器,如果有未处理的数据,丢弃
nginx -s quit
# 优雅的停止nginx服务器,如果有未处理的数据,等待处理完成之后停止
也可以写两个.bat文件
1 // start.bat 2 start nginx -c ./conf/nginx.conf 3 4 // stop.bat 5 nginx -s stop 6 pause
main # 全局配置
events { # nginx工作模式配置
}
http { # http设置
....
server { # 服务器主机配置
....
location { # 路由配置
....
}
location path {
....
}
location otherpath {
....
}
}
server {
....
location {
....
}
}
upstream name { # 负载均衡配置
....
}
}
如上述配置文件所示,主要由6个部分组成:
-
main:用于进行nginx全局信息的配置
-
events:用于nginx工作模式的配置
-
http:用于进行http协议信息的一些配置
-
server:用于进行服务器访问信息的配置
-
location:用于进行访问路由的配置
-
upstream:用于进行负载均衡的配置
user nobody nobody; # user用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行 worker_processes 2; # 指定nginx要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍 error_log logs/error.log # 定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】 pid logs/nginx.pid # 用来指定进程id的存储文件的位置 worker_rlimit_nofile 1024;# 指定一个进程可以打开最多文件数量的描述
nginx服务器的工作模式的一些操作配置
event { worker_connections 1024; # 指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和worker processes共同决定的。 multi_accept on; # 指定nginx在收到一个新连接通知后尽可能多的接受更多的连接 use epoll; # 指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue }
作为web服务器,http模块是nginx最核心的一个模块,配置项也是比较多的,项目中会设置到很多的实际业务场景,需要根据硬件信息进行适当的配置,常规情况下,使用默认配置即可!
http { ## # 基础配置 ## sendfile on; # 配置on让sendfile发挥作用,将文件的回写过程交给数据缓冲去去完成,而不是放在应用中完成,这样的话在性能提升有有好处 tcp_nopush on; # 让nginx在一个数据包中发送所有的头文件,而不是一个一个单独发 tcp_nodelay on; # 让nginx不要缓存数据,而是一段一段发送,如果数据的传输有实时性的要求的话可以配置它,发送完一小段数据就立刻能得到返回值,但是不要滥用哦 keepalive_timeout 65; # 给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。一般设置时间较短,可以让nginx工作持续性更好 client_header_timeout 120s; #调大点 设置请求头的超时时间 client_body_timeout 120s; #调大点 设置请求体的超时时间 client_max_body_size 500m; #主要是这个参数,限制了上传文件大大小 types_hash_max_size 2048; # 混淆数据,影响三列冲突率,值越大消耗内存越多,散列key冲突率会降低,检索速度更快;值越小key,占用内存较少,冲突率越高,检索速度变慢 server_tokens off; # 虽然不会让nginx执行速度更快,但是可以在错误页面关闭nginx版本提示,对于网站安全性的提升有好处哦 # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; # 指定在当前文件中包含另一个文件的指令 default_type application/octet-stream; # 指定默认处理的文件类型可以是二进制 ## # SSL证书配置 ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; ## # 日志配置 ## access_log /var/log/nginx/access.log; # 设置存储访问记录的日志 error_log /var/log/nginx/error.log; # 设置存储记录错误发生的日志 ## # Gzip 压缩配置 ## gzip on; gzip_disable "msie6"; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # 虚拟主机配置 ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*;
srever模块配置是http模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息
server { listen 80; server_name localhost; #指定ip地址或者域名,多个配置之间用空格分隔 #http连接超时时间,默认是100s。上传文件比较大,在规定时间未上传完成,会自动断开连接 keepalive_timeout 100; client_header_timeout 120s; #调大点 client_body_timeout 120s; #调大点 client_max_body_size 500m; #主要是这个参数,限制了上传文件大大小 #location ^~/alarmApi/:表示匹配访问/alarmApi location ^~/alarmApi/{ proxy_pass http://iot-device-alarm.haier-haiergroup.svc.cluster.local:8011; } #添加访问目录为/san的代理配置 location /san/ { rewrite ^/san/(.*)$ http://10.133.0.72:32664/$1 permanent; proxy_pass http://10.133.0.72:32664/; } # ui location / { root /opt/webs/device_alarm_clinet/dist; #表示整个server虚拟主机内的根目录,所有当前主机中web项目的根目录 index index.html index.htm; #用户访问web网站时的全局首页 try_files $uri $uri/ /index.html; #解决刷新变404问题 } }
upstream模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器
upstream name { ip_hash; server 192.168.1.100:8000; server 192.168.1.100:8001 down; server 192.168.1.100:8002 max_fails=3; server 192.168.1.100:8003 fail_timeout=20s; server 192.168.1.100:8004 max_fails=3 fail_timeout=20s; }
核心配置信息如下
ip_hash:指定请求调度算法,默认是weight权重轮询调度,可以指定
server host:port:分发服务器的列表配置
-- down:表示该主机暂停服务
-- max_fails:表示失败最大次数,超过失败最大次数暂停服务
-- fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求
8. 附上自己的nginx.conf和Dockerfile
#user nobody; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /etc/nginx/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; #通用APP-设备告警APP server { listen 80; server_name localhost; #http连接超时时间,默认是100s。上传文件比较大,在规定时间未上传完成,会自动断开连接 keepalive_timeout 100; client_header_timeout 120s; #调大点 client_body_timeout 120s; #调大点 client_max_body_size 500m; #主要是这个参数,限制了上传文件大大小 #自己服务的接口 location ^~/energyApi/{ proxy_pass http://iot-device-energy.haier-haiergroup.svc.cluster.local:8014; } #添加访问目录为/san的代理配置 location /san/ { rewrite ^/san/(.*)$ http://10.133.0.72:32664/$1 permanent; proxy_pass http://10.133.0.72:32664/; } # ui location / { root /opt/webs/device_energy_clinet/dist; #打包后项目路径 index index.html index.htm; try_files $uri $uri/ /index.html; #解决刷新变404问题 } } }
FROM nginx EXPOSE 80 COPY dist /opt/webs/device_energy_clinet/dist COPY nginx.conf /etc/nginx/nginx.conf