Nginx-02-反向代理、负载均衡、动静分离

1:反向代理

1:实例:访问ngix地址,跳转到tomcat

1 、实现效果

打开浏览器,在浏览器地址栏输入地址 www.123.com ,跳转到 liunx 系统 tomcat 主页
面中

2:准备工作

1:linux系统安装tomcat,使用8080端口

  • tomcat 安装文件放到 liunx 系统中,解压

  • 在这里插入图片描述

  • 进入 tomcat 的 的 bin 目录中,./startup.sh 启动 tomcat 服务器

  • 在这里插入图片描述

2:windows中访问tomcat-记得开启端口
博主所用的是云服务,在防火墙规则中开启;如果linux可以使用以下命令开启防火墙端口
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd –reload
在这里插入图片描述

3:在 在 windows 系统的 host 文件进行域名和 ip
注:浏览器在访问地址时,会先去本地的hosts文件中查找,如果找不到就去网络上的dns域名解析器查找
在这里插入图片描述
在这里插入图片描述

4:配置nginx反向代理
配置nginx访问tomcat的应用端口
在这里插入图片描述

5:最终测试
在这里插入图片描述

2:实例:访问不同地址,跳转到不同的tomcat

1:实现效果

使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中
访问 http://www.wkl.com:8080/edu/ 直接跳转到 127.0.0.1:8080
访问 http:// www.wkl.com:8080/vod/ 直接跳转到 127.0.0.1:8081

2:准备工作

(1 )准备两个 tomcat 服务器,一个 8080 端口,一个 8081 端口
(2)创建不同tomcat的测试页面
在这里插入图片描述
在这里插入图片描述

3:配置nginx

在这里插入图片描述

4:最终测试

在这里插入图片描述
在这里插入图片描述

注:location 配置说明

在这里插入图片描述

  • 1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配
    成功,就停止继续向下搜索并立即处理该请求。
  • 2、~:用于表示 uri 包含正则表达式,并且区分大小写。
  • 3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
  • 4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location块中的正则 uri 和请求字符串做匹配。
    注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

2:负载均衡

1:准备两个同时启动的tomcat

已启动,如上边配置的

2:在nginx.xml中配置

在这里插入图片描述

3:最终测试

在这里插入图片描述
在这里插入图片描述

注:nginx负载均衡分配策略

  • 第一种 轮询(默认)
    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 。 掉,能自动剔除。

  • 第二种 weight
    weight 代表权重默认为 1, 权重越高被分配的客户端越多
    在这里插入图片描述

  • 第三种 ip_hash
    每个请求按访问 ip 的 的 hash 结果分配,这样每个访客固定访问一个后端服务器
    在这里插入图片描述

  • 第四种 fair (第三方)
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。
    在这里插入图片描述

3:动静分离

Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和
静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx
处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种,
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使
浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资
源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,
所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,
不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送
一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码
304,如果有修改,则直接从服务器重新下载,返回状态码 200。

1:资源准备

在/data/image/路径下准备一张图片
在这里插入图片描述

2:nginx配置

在这里插入图片描述

3:最终测试

在这里插入图片描述

4:nginx 配置全面讲解

1:基本命令

nginx -s reload  # 向主进程发送信号,重新加载配置文件,热重启
nginx -s reopen	 # 重启 Nginx
nginx -s stop    # 快速关闭
nginx -s quit    # 等待工作进程处理完成后关闭
nginx -T         # 查看当前 Nginx 最终的配置
nginx -t         # 检查配置是否有问题

2:Nginx核心配置

nginx.conf配置文件结构

# main段配置信息
user  nginx;                        # 运行用户,默认即是nginx,可以不进行设置
worker_processes  auto;             # Nginx 进程数,一般设置为和 CPU 核数一样
error_log  /var/log/nginx/error.log warn;   # Nginx 的错误日志存放目录
pid        /var/run/nginx.pid;      # Nginx 服务启动时的 pid 存放位置

# events段配置信息
events {
    use epoll;     # 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的)
    worker_connections 1024;   # 每个进程允许最大并发数
}

# http段配置信息
# 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
http { 
    # 设置日志模式
    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  /var/log/nginx/access.log  main;   # Nginx访问日志存放位置

    sendfile            on;   # 开启高效传输模式
    tcp_nopush          on;   # 减少网络报文段的数量
    tcp_nodelay         on;
    keepalive_timeout   65;   # 保持连接的时间,也叫超时时间,单位秒
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;      # 文件扩展名与类型映射表
    default_type        application/octet-stream;   # 默认文件类型

    include /etc/nginx/conf.d/*.conf;   # 加载子配置项,这里指的是启用conf.d下所有.conf的文件
    
    # server段配置信息
    server {
    	listen       80;       # 配置监听的端口
    	server_name  localhost;    # 配置的域名
      
    	# location段配置信息
    	location / {
    		root   /usr/share/nginx/html;  # 网站根目录
    		index  index.html index.htm;   # 默认首页文件,入口文件
    		deny 172.168.22.11;   # 禁止访问的ip地址,可以为all
    		allow 172.168.33.44;# 允许访问的ip地址,可以为all
    	}
    	
    	error_page 500 502 503 504 /50x.html;  # 默认50x对应的访问页面
    	error_page 400 404 error.html;   # 同上
    }
}
  • main 全局配置,对全局生效;
  • events 配置影响 Nginx 服务器与用户的网络连接;
  • http 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
  • server 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;
  • location 用于配置匹配的 uri ;
  • upstream 配置后端服务器具体地址,负载均衡配置不可或缺的部分;

用一张图清晰的展示它的层级结构:
在这里插入图片描述

引用其他站点,通过在nginx.conf 中配置的include /etc/nginx/conf.d/*.conf来引用

server {
    	listen       80;       # 配置监听的端口
    	server_name  localhost;    # 配置的域名
      
    	# location段配置信息
    	location / {
    		root   /usr/share/nginx/html;  # 网站根目录
    		index  index.html;   # 默认首页文件,入口文件
    		deny 172.168.22.11;   # 禁止访问的ip地址,可以为all
    		allow 172.168.33.44;# 允许访问的ip地址,可以为all
    	}
    	
    	error_page 500 502 503 504 /50x.html;  # 默认50x对应的访问页面
    	error_page 400 404 error.html;   # 同上
    }

nginx.conf 配置文件的语法规则:

  • 配置文件由指令与指令块构成
  • 每条指令以 “;” 分号结尾,指令与参数间以空格符号分隔
  • 指令块以 {} 大括号将多条指令组织在一起
  • include 语句允许组合多个配置文件以提升可维护性
  • 通过 # 符号添加注释,提高可读性
  • 通过 $ 符号使用变量
  • 部分指令的参数支持正则表达式,例如常用的 location 指令

3:nginx 使用小技巧

1:根据文件类型设置过期时间

location ~.*\.css$ {
    expires 1d;
    break;
}
location ~.*\.js$ {
    expires 1d;
    break;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    access_log off;
    expires 15d;    #保存15天
    break;
}

2:指定定错误页面

# 根据状态码,返回对于的错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
    root /source/error_page;
}

3:跨域问题

跨域的定义
同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。通常不允许不同源间的读操作。

同源的定义
如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源。

nginx解决跨域的原理
例如:

  • 前端server域名为:http://xx_domain
  • 后端server域名为:https://github.com
    现在http://xx_domain对https://github.com发起请求一定会出现跨域。

不过只需要启动一个nginx服务器,将server_name设置为xx_domain,然后设置相应的location以拦截前端需要跨域的请求,最后将请求代理回github.com。如下面的配置

## 配置反向代理的参数
server {
    listen    8080;
    server_name xx_domain

    ## 1. 用户访问 http://xx_domain,则反向代理到 https://github.com
    location / {
        proxy_pass  https://github.com;
        proxy_redirect     off;
        proxy_set_header   Host             $host;        # 传递域名
        proxy_set_header   X-Real-IP        $remote_addr; # 传递ip
        proxy_set_header   X-Scheme         $scheme;      # 传递协议
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
}

4:全量配置示例

	#定义Nginx运行的用户和用户组
	user www www;
	#
	#nginx进程数,建议设置为等于CPU总核心数.
	worker_processes 8;
	#
	#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
	error_log /var/log/nginx/error.log info;
	#
	#进程文件
	pid /var/run/nginx.pid;
	#
	#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致.
	worker_rlimit_nofile 65535;
	#
	#工作模式与连接数上限
	events
	{
	#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型.
	use epoll;
	#单个进程最大连接数(最大连接数=连接数*进程数)
	worker_connections 65535;
	}
	#
	#设定http服务器
	http
	{
		include mime.types; #文件扩展名与文件类型映射表
		default_type application/octet-stream; #默认文件类型
		#charset utf-8; #默认编码
		server_names_hash_bucket_size 128; #服务器名字的hash表大小
		client_header_buffer_size 32k; #上传文件大小限制
		large_client_header_buffers 4 64k; #设定请求缓
		client_max_body_size 8m; #设定请求缓

		# 开启目录列表访问,合适下载服务器,默认关闭.
		autoindex on; # 显示目录
		autoindex_exact_size on; # 显示文件大小 默认为on,显示出文件的确切大小,单位是bytes 改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
		autoindex_localtime on; # 显示文件时间 默认为off,显示的文件时间为GMT时间 改为on后,显示的文件时间为文件的服务器时间

		sendfile on; # 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载.注意:如果图片显示不正常把这个改成off.
		tcp_nopush on; # 防止网络阻塞
		tcp_nodelay on; # 防止网络阻塞

		keepalive_timeout 120; # (单位s)设置客户端连接保持活动的超时时间,在超过这个时间后服务器会关闭该链接

		# FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度.下面参数看字面意思都能理解.
		fastcgi_connect_timeout 300;
		fastcgi_send_timeout 300;
		fastcgi_read_timeout 300;
		fastcgi_buffer_size 64k;
		fastcgi_buffers 4 64k;
		fastcgi_busy_buffers_size 128k;
		fastcgi_temp_file_write_size 128k;

		# gzip模块设置
		gzip on; #开启gzip压缩输出
		gzip_min_length 1k; #允许压缩的页面的最小字节数,页面字节数从header偷得content-length中获取.默认是0,不管页面多大都进行压缩.建议设置成大于1k的字节数,小于1k可能会越压越大
		gzip_buffers 4 16k; #表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
		gzip_http_version 1.1; #压缩版本(默认1.1,目前大部分浏览器已经支持gzip解压.前端如果是squid2.5请使用1.0)
		gzip_comp_level 2; #压缩等级.1压缩比最小,处理速度快.9压缩比最大,比较消耗cpu资源,处理速度最慢,但是因为压缩比最大,所以包最小,传输速度快
		gzip_types text/plain application/x-javascript text/css application/xml;
		#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn.
		gzip_vary on;#选项可以让前端的缓存服务器缓存经过gzip压缩的页面.例如:用squid缓存经过nginx压缩的数据

		#开启限制IP连接数的时候需要使用
		#limit_zone crawler $binary_remote_addr 10m;

		##upstream的负载均衡,四种调度算法(下例主讲)##

		#虚拟主机的配置
		server
		{
			# 监听端口
			listen 80;
			# 域名可以有多个,用空格隔开
			server_name ably.com;
			# HTTP 自动跳转 HTTPS
			rewrite ^(.*) https://$server_name$1 permanent;
		}

		server
		{
			# 监听端口 HTTPS
			listen 443 ssl;
			server_name ably.com;

			# 配置域名证书
			ssl_certificate C:\WebServer\Certs\certificate.crt;
			ssl_certificate_key C:\WebServer\Certs\private.key;
			ssl_session_cache shared:SSL:1m;
			ssl_session_timeout 5m;
			ssl_protocols SSLv2 SSLv3 TLSv1;
			ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
			ssl_prefer_server_ciphers on;

			index index.html index.htm index.php;
			root /data/www/;
			
			location ~ .*\.(php|php5)?$
			{
				fastcgi_pass 127.0.0.1:9000;
				fastcgi_index index.php;
				include fastcgi.conf;
			}

			# 配置地址拦截转发,解决跨域验证问题
			location /oauth/{
				proxy_pass https://localhost:13580/oauth/;
				proxy_set_header HOST $host;
				proxy_set_header X-Real-IP $remote_addr;
				proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			}

			# 图片缓存时间设置
			location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
				expires 10d;
			}

			# JS和CSS缓存时间设置
			location ~ .*\.(js|css)?$ {
				expires 1h;
			}

			# 日志格式设定
			log_format access '$remote_addr - $remote_user [$time_local] "$request" '
			'$status $body_bytes_sent "$http_referer" '
			'"$http_user_agent" $http_x_forwarded_for';
			# 定义本虚拟主机的访问日志
			access_log /var/log/nginx/access.log access;

			# 设定查看Nginx状态的地址.StubStatus模块能够获取Nginx自上次启动以来的工作状态,此模块非核心模块,需要在Nginx编译安装时手工指定才能使用
			location /NginxStatus {
				stub_status on;
				access_log on;
				auth_basic "NginxStatus";
				auth_basic_user_file conf/htpasswd;
				#htpasswd文件的内容可以用apache提供的htpasswd工具来产生.
			}
		}
	}

想了解更加详细配置,推荐查看链接:https://zhuanlan.zhihu.com/p/625184405

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苍煜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值