前言:Nginx服务器可以用来做反向代理、负载均衡和动静分离。

一、反向代理实战
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。

1.1、实现目标
访问http://39.106.49.9/edu/ 直接跳转到 127.0.0.1:8001
访问http://39.106.49.9/xmh/ 直接跳转到 ip地址:8080
1.2、准备两台Tomcat下的hml网页访问
①在两台云服务器上配置两个Tomcat,端口分别为8001和8080,都可以访问,端口修改配置文件即可。

②新建html内容分别添加8001端口!!!和8080端口!!!


1.3、修改Nginx配置文件 nginx.conf
nginx安装目录下: /usr/local/nginx/conf/nginx.conf (location过滤请求不能指定为 /naive,我很奇怪)
server {
listen 80;
server_name 39.106.49.9;
#charset koi8-r;
#access_log logs/host.access.log main;
location /edu/ {
proxy_pass http://127.0.0.1:8001;
}
location /xmh/ {
proxy_pass http://你的ip地址:8080;
}
}重新加载nginx
./nginx -s reload1.4、测试访问
实现了同一个端口Nginx反向代理,通过edu和xmh路径的切换显示不同的页面


二、负载均衡实战
负载均衡(Load Balance)是集群技术(Cluster)的一种应用。负载均衡可以将工作任务(如Web服务)分摊到多个处理单元,共同完成工作任务,从而提高并发处理能力。Web负载均衡主要作用就是用来提升服务器性能,可以处理更多的请求和更大量的数据。

2.1、修改nginx.conf
upstream myserver {
server 127.0.0.1:8001;
server 8.131.82.44:8080;
}
server {
listen 80;
server_name 39.106.49.939;
location / {
proxy_pass http://myserver;
}
}
重启nginx
./nginx -s reload2.2、在8080的tomcat的webapps文件夹下新建edu文件夹和8001.html文件,填写内容为8080端口!!!

2.3、在地址栏回车,就会分发到不同的tomcat服务器上


2.4、负载均衡方式
①轮询(默认)
②weight,代表权,权越高优先级越高
③fair,按后端服务器的响应时间来分配请求,相应时间短的优先分配
④ip_hash,每个请求按照访问ip的hash结果分配,这样每一个访客固定的访问一个后端服务器,可以解决session 的问题
2.5、负载均衡分类
1)二层负载均衡(mac)
根据OSI模型分的二层负载,一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后分配后端实际的MAC地址响应.
2)三层负载均衡(ip)
一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后分配后端实际的IP地址响应. (即一个ip对一个ip的转发, 端口全放开)
3)四层负载均衡(tcp)
在三次负载均衡的基础上,即从第四层"传输层"开始, 使用"ip+port"接收请求,再转发到对应的机器。
4)七层负载均衡(http)
从第七层"应用层"开始, 根据虚拟的url或IP,主机名接收请求,再转向相应的处理服务器。
我们运维中最常见的四层和七层负载均衡,这里重点说下这两种负载均衡。
1>四层的负载均衡就是基于IP+端口的负载均衡:在三层负载均衡的基础上,通过发布三层的IP地址(VIP),然后加四层的端口号,来决定哪些流量需要做负载均衡,对需要处理的流量进行NAT处理,转发至后台服务器,并记录下这个TCP或者UDP的流量是由哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理。
对应的负载均衡器称为四层交换机(L4 switch),主要分析IP层及TCP/UDP层,实现四层负载均衡。此种负载均衡器不理解应用协议(如HTTP/FTP/MySQL等等)。
实现四层负载均衡的软件有:
F5:硬件负载均衡器,功能很好,但是成本很高。
lvs:重量级的四层负载软件
nginx:轻量级的四层负载软件,带缓存功能,正则表达式较灵活
haproxy:模拟四层转发,较灵活
2>七层的负载均衡就是基于虚拟的URL或主机IP的负载均衡:在四层负载均衡的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比如同一个Web服务器的负载均衡,除了根据VIP加80端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。举个例子,如果你的Web服务器分成两组,一组是中文语言的,一组是英文语言的,那么七层负载均衡就可以当用户来访问你的域名时,自动辨别用户语言,然后选择对应的语言服务器组进行负载均衡处理。
对应的负载均衡器称为七层交换机(L7 switch),除了支持四层负载均衡以外,还有分析应用层的信息,如HTTP协议URI或Cookie信息,实现七层负载均衡。此种负载均衡器能理解应用协议。
实现七层负载均衡的软件有:
haproxy:天生负载均衡技能,全面支持七层代理,会话保持,标记,路径转移;
nginx:只在http协议和mail协议上功能比较好,性能与haproxy差不多;
apache:功能较差
Mysql proxy:功能尚可。
总的来说,一般是lvs做4层负载;nginx做7层负载(也能做4层负载, 通过stream模块);haproxy比较灵活,4层和7层负载均衡都能做
三、动静分离实战
Nginx作为网页静态服务器:为了加快网站的解析速度,可以把动态页面和静态页面交给不同的服务器来解析,加快解析的速度,降低由单个服务器的压力
把动态请求和静态请求分开,不是讲动态页面和静态页面物理分离,可以理解为nginx处理静态页面,tomcat处理动态页面
动静分离大致分为两种:一、纯粹将静态文件独立成单独域名放在独立的服务器上,也是目前主流方案;二、将动态跟静态文件混合在一起发布,通过nginx分开。
动静分离图析

3.1、准备静态文件


3.2、配置nginx

四、Nginx 常用配置清单
侦听端口
server {
# Standard HTTP Protocol
listen 80;
# Standard HTTPS Protocol
listen 443 ssl;
# For http2
listen 443 ssl http2;
# Listen on 80 using IPv6
listen [::]:80;
# Listen only on using IPv6
listen [::]:80 ipv6only=on;
}
访问日志
server {
# Relative or full path to log file
access_log /path/to/file.log;
# Turn 'on' or 'off'
access_log on;
}
域名
server {
# Listen to yourdomain.com
server_name yourdomain.com;
# Listen to multiple domains server_name yourdomain.com www.yourdomain.com;
# Listen to all domains
server_name *.yourdomain.com;
# Listen to all top-level domains
server_name yourdomain.*;
# Listen to unspecified Hostnames (Listens to IP address itself)
server_name "";
}
静态资产
server {
listen 80;
server_name yourdomain.com;
location / {
root /path/to/website;
}
}
重定向
server {
listen 80;
server_name www.yourdomain.com;
return 301 http://yourdomain.com$request_uri;
}
server {
listen 80;
server_name www.yourdomain.com;
location /redirect-url {
return 301 http://otherdomain.com;
}
}
反向代理
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://0.0.0.0:3000;
# where 0.0.0.0:3000 is your application server (Ex: node.js) bound on 0.0.0.0 listening on port 3000
}
}
负载均衡
upstream node_js {
server 0.0.0.0:3000;
server 0.0.0.0:4000;
server 123.131.121.122;
}
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://node_js;
}
}
SSL 协议
server {
listen 443 ssl;
server_name yourdomain.com;
ssl on;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/privatekey.pem;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/fullchain.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_timeout 1h;
ssl_session_cache shared:SSL:50m;
add_header Strict-Transport-Security max-age=15768000;
}
# Permanent Redirect for HTTP to HTTPS
server
{
listen 80;
server_name yourdomain.com;
return 301 https://$host$request_uri;
}五、Nginx部署https的方法
(1)新建与配置文件Nginx.conf同级文件夹lls放置证书

(2)在Nginx.conf配置文件中加入如下代码
server {
listen 443 ssl;
server_name www.zhengzl.cn;
ssl_certificate lls/zhengzl.crt;
ssl_certificate_key lls/zhengzl.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
#禁止在header中出现服务器版本,防止黑客利用版本漏洞攻击
server_tokens off;
#如果是全站 HTTPS 并且不考虑 HTTP 的话,可以加入 HSTS 告诉你的浏览器本网站全站加密,并且强制用 HTTPS 访问
fastcgi_param HTTPS on;
fastcgi_param HTTP_SCHEME https;
access_log /usr/local/nginx/logs/httpsaccess.log;
}

(3)想要自动https就要加入如下代码
server {
listen 80;
server_name www.yourdomain.com;
rewrite ^(.*) https://$server_name$1 permanent; #http 跳转 https
}
(4)重启Nigex服务器访问
六、Nginx高可用
如果Nginx宕机,用户请求无法实现效果。我们需要保证Nginx的高可用,安装keepalived组件,实现Nginx的主备部署。
Keepalived是一个免费开源的,用C编写的类似于layer3, 4 & 7交换机制软件,具备我们平时说的第3层、第4层和第7层交换机的功能。主要提供loadbalancing(负载均衡)和 high-availability(高可用)功能,负载均衡实现需要依赖Linux的虚拟服务内核模块(ipvs),而高可用是通过VRRP协议实现多台机器之间的故障转移服务。

参考链接: