一、从分布式集群到ngnix
Nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能,时常用于服务端的反向代理和负载均衡。
nginx可以当做反向代理服务器来使用:
我们需要提前在nginx中配置好反向代理的规则,不同的请求,交给不同的真实服务器处理
当请求到达nginx,nginx会根据已经定义的规则进行请求的转发,从而实现路由功能
Nginx的优点
支持海量高并发:采用IO多路复用epoll。官方测试Nginx能够支持5万并发链接,实际生产环境中可以支撑2-4万并发连接数。
内存消耗少:在主流的服务器中Nginx目前是内存消耗最小的了,比如我们用Nginx+PHP,在3万并发链接下,开启10个Nginx进程消耗150M内存。
免费使用可以商业化:Nginx为开源软件,采用的是2-clause BSD-like协议,可以免费使用,并且可以用于商业。
配置文件简单:网络和程序配置通俗易懂,即使非专业运维也能看懂。
二、正向代理与反向代理
正向代理
正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
正向代理的用途:
(1)访问原来无法访问的资源,如google
(2) 可以做缓存,加速访问资源
(3)对客户端访问授权,上网进行认证
(4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
反向代理
反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
反向代理的作用:
(1)保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击。大型网站,通常将反向代理作为公网访问地址,Web服务器是内网。
(2)负载均衡,通过反向代理服务器来优化网站的负载
正向代理与反向代理区别
正向代理隐藏真实客户端,反向代理隐藏真实服务端
正向代理需要设置代理服务器信息,反向代理不需要任何配置
正向代理指向目标ip地址,而反向代理则不一定。
正向代理是客户端到服务器端的转发代理,反向代理是网站内部负载均衡做的集群请求转发。
正向代理一般用于提供无墙外网访问,反向代理是将防火墙后面的服务器作为服务提供给外面的客户端访问。
正向代理客户端知道是连的代理服务器,反向代理后面的服务器对客户端来说是完全透明的,客户端不知道自己连的具体是哪台服务器。
三、反向代理服务器安装
1、在安装nginx之前先安装nginx的依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
2、查看一下nginx有没有安装好
find -name nginx
3、下载nginx,解压nginx,进入nginx-1.10.2
wget http://learning.happymmall.com/nginx/linux-nginx-1.10.2.tar.gz
tar -zxvf linux-nginx-1.10.2.tar.gz
cd nginx-1.10.2
6、指向configure,执行make,执行安装
sudo ./configure
sudo make
sudo make install
9、执行whereis nginx,进入 sbin/,启动nginx
whereis nginx
cd sbin/
sudo ./nginx
12、查看nginx的进程
ps auxl grep nginx
13、浏览器测试
在浏览器地址栏输入ip地址,直接打开nginx页面即为成功
四、ngnix企业级常用配置
1、全局块:
配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
user administrator administrators; #运行用户或用户组,默认是nginx,可以不进行设置
worker_processes 2; #允许生成的ngnix进程数,默认为1
pid /nginx/pid/nginx.pid; #ngnix进程pid存放位置
error_log log/error.log debug; #错误日志存放位置,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
2、events块:
配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #单个后台进程的最大并发数
}
3、http块:
可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat ‘
r
e
m
o
t
e
a
d
d
r
–
remote_addr–
remoteaddr–remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for’; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
access_log /var/log/nginx/access.log main;#nginx访问日志的存放位置
include /etc/nginx/conf.d/*.conf;#包含的子配置项的位置和文件
}
4、server块
//server虚拟主机的配置
server //设置负载均衡所访问的域名
upstream dqc{ //负载均衡列表 权重
server 10.10.10.10:10 weight=10 max_fails=2 fail_timeout=30s;
server 10.10.10.11:10 weight=10 max_fails=2 fail_timeout=30s;
server 10.10.10.12:10 weight=10 max_fails=2 fail_timeout=30s;
}
server{
listen 80; //监听端口
server_name baidu.com; 域名
add_header ‘Access-Control-Allow-Origin’ ‘*’;
log_format warn ‘$remote_addr -
r
e
m
o
t
e
u
s
e
r
[
remote_user [
remoteuser[time_local] “KaTeX parse error: Double superscript at position 34: … '̲status
b
o
d
y
b
y
t
e
s
s
e
n
t
"
body_bytes_sent "
bodybytessent"http_referer” ’
‘“
h
t
t
p
u
s
e
r
a
g
e
n
t
"
"
http_user_agent" "
httpuseragent""http_x_forwarded_for”’
‘$request_time - $bytes_sent - $request_length - $upstream_response_time’;
access_log /export/servers/nginx/logs/access.log warn;
error_log /export/servers/nginx/logs/error.log warn;
location ^~ /dqc/ { //拦截映射
client_body_temp_path /export/servers/nginx/nginx_temp/ 1 2;
proxy_temp_path /export/servers/nginx/nginx_temp/ 1 2;
proxy_pass http://dqc ;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 100m;
}
}
上面是nginx的基本配置,需要注意的有以下几点:
1、几个常见配置项:
1 .remote_addr 与 http_x_forwarded_for 用以记录客户端的ip地址;
2. remote_user :用来记录客户端用户名称;
3.time_local : 用来记录访问时间与时区;
4.request : 用来记录请求的url与http协议;
5.status : 用来记录请求状态;成功是200;
6.body_bytes_s ent :记录发送给客户端文件主体内容大小;
7.http_referer :用来记录从那个页面链接访问过来的;
8.http_user_agent :记录客户端浏览器的相关信息;
2、惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进程能获得链接,这样会影响系统性能
实现域名访问网站—nginx反向代理
1.从域名访问到最终定位到机器Ip
DNS解析过程:本地浏览器缓存-------》host文件--------》本地DNS服务器(局域网)---------》ISP商DNS服务器(联通,移动)-------》顶级域名服务器--------》根域名服务器(对外13台)
2.访问网站请求流程
假设客户端A--------》浏览器url请求域名--------》域名被host解析对应的IP--------》到对应IP的服务器--------》先被nginx反向代理拦截--------》找到nginx上一样域名(nginx.conf配置文件中server里的server_name)--------》对应的反向映射地址(nginx.conf配置文件中同左server里的proxy_pass 就是对应的Tomcat里WEB的发布路径如 http:localhost:8080)--------》对应8080端口的项目
3.ngnix配置