Nginx-> 网络服务器
正向代理
是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
客户端必须要进行一些特别的设置才能使用正向代理。就像要访问google用代理去访问(用户知道要访问真正的服务器)
nginx的反向代理
什么是反向代理
指的是浏览器/客户端并不知道自己要访问具体哪台目标服务器,只知道去访问代理服务器 ,代理服务器再通过反向代理 +负载均衡实现请求分发到应用服务器的一种代理服务。
反向代理服务的特点是代理服务器 代理的对象是应用服务器,也就是对于浏览器/客户端 来说应用服务器是隐藏的。
以租房为例解释正向代理和反向代理?
客户端 <一> 代理 <一>服务端
A租房人(客户端),B房产中介(代理),C真实房东(服务端)
1、正向代理
A租房人(客户端)想租C真实房东的房子,但不认识C真实房东(服务端)
B房产中介(代理)认识C真实房东(服务端),并且从C真实房东(服务端)租到了房
A租房人(客户端)通过B房产中介(代理)租到了C真实房东(服务端)的房
C真实房东(服务端)只知道房子租给了B房产中介(代理),并不知道A租房人(客户端)租了自己的房子
2、反向代理
A租房人(客户端)要租B房产中介(代理)的房
B房产中介(代理)从C真实房东(服务端)手里租了A租房人(客户端)想要租的房
A租房人(客户端)不知道这套房子真实房东是C真实房东(服务端)
C真实房东(服务端)不知道自己的房子被A租房人(客户端)租住
首先安装nginx安装环境
第一步
安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc:
命令:yum install gcc-c++
第二步
PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。
命令:yum install -y pcre pcre-devel
第三步
zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。
命令:yum install -y zlib zlib-devel
第四步
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。
命令:yum install -y openssl openssl-devel
1、将安装包上传到/home,解压
命令:tar -zxvf nginx-1.8.1.tar.gz
2、自定义创建一个文件夹作为Nginx安装目录,这里在home下创建nginx文件夹;
命令:cd /home
命令:mkdir nginx
3、在解压的目录(nginx-1.8.1)下执行
先输入命令 : cd /home/nginx-1.8.1
再执行 命令 :./configure --prefix=/home/nginx
意思即配置安装环境,将会把Nginx安装到/home/nginx下
4,编译:在解压的文件夹(nginx-1.8.1)下先后执行make 和 make install 命令
先输入 make
然后输入 make install
5、然后进入nginx/sbin目录下
命令: cd /home/nginx/sbin
执行命令:./nginx 启动nginx
关闭防火墙
systemctl stop firewalld
或者打开端口
firewall-cmd --add-port=80/tcp --permanent (防火墙关闭了,不用做这个操作)
在浏览器输入对应的ip地址,不用加端口号,因为nginx默认是80端口,可以省略,就可以访问到nginx
启动:
windows
直接点击Nginx目录下的nginx.exe 或者 cmd运行start nginx
linux
nginx目录下,sbin目录中,./nginx
关闭
nginx -s stop 或者 nginx -s quit
stop表示立即停止nginx,不保存相关信息
quit表示正常退出nginx,并保存相关信息
nginx -s stop 或者 nginx -s quit
nginx -s reload :修改配置后重新加载生效
nginx -s reopen :重新打开日志文件
nginx -t -c /path/to/nginx.conf 测试nginx配置文件是否正确
nginx -s reopen #重启Nginx
nginx -s reload #重新加载Nginx配置文件,然后以优雅的方式重启Nginx
nginx -s stop #强制停止Nginx服务
nginx -s quit #优雅地停止Nginx服务(即处理完所有请求后再停止服务)
nginx -t #检测配置文件是否有语法错误,然后退出
nginx -?,-h #打开帮助信息
nginx -v #显示版本信息并退出
nginx -V #显示版本和配置选项信息,然后退出
nginx -t #检测配置文件是否有语法错误,然后退出
nginx -T #检测配置文件是否有语法错误,转储并退出
nginx -q #在检测配置文件期间屏蔽非错误信息
nginx -p prefix #设置前缀路径(默认是:/usr/share/nginx/)
nginx -c filename #设置配置文件(默认是:/etc/nginx/nginx.conf)
nginx -g directives #设置配置文件外的全局指令
killall nginx #杀死所有nginx进程
1,修改配置文件
Nginx默认使用端口是80,这里直接先把Nginx端口改为8090
命令:vi /home/nginx/conf/nginx.conf
在42行位置,输入以下代码内容
location ~ .*\.(gif|jpg|jpeg|png)$ {
expires 24h;
root /home/images/;#指定图片存放路径
access_log /home/nginx/logs/images.log;#图片 日志路径
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_temp_path /home/images/;#代理临时路径
proxy_redirect off;
proxy_set_header Host 127.0.0.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 1280k;
proxy_connect_timeout 900;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 40k;
proxy_buffers 40 320k;
proxy_busy_buffers_size 640k;
proxy_temp_file_write_size 640k;
if ( !-e $request_filename)
{
proxy_pass http://127.0.0.1:8090;#代理访问地址,和上面的端口一致
}
}
2,重新加载nginx
修改了nginx配置文件后,得重重新启动一下nginx
切换目录 命令:cd /home/nginx/sbin
重新加载 命令:./nginx -s reload
3,在/home下,新建一个images目录
系统一般会自动创建,可以先用 ls /home看看有没有这个目录
没有就创建 : mkdir /home/images
4,上传几张图片到images中
5,再次访问,加上上面新设置的端口号,将图片名称加在地址后面即可
1,复制3个tomcat,分别是
命令 : cd /home
复制命令 :
cp -r apache-tomcat-9.0.30 ./tomcat-8081
cp -r apache-tomcat-9.0.30 ./tomcat-8082
cp -r apache-tomcat-9.0.30 ./tomcat-8083
分别修改这几各tomcat对应的端口号
用工具找到位置 : /home/tomcat-8081/conf/server.xml
右击打开,修改端口
tomcat-8081
tomcat-8082
tomcat-8083
2,新建一个test.html,内容分别为对应端口号的内容显示
第1步:新建一个txt文本,在里面输入内容
然后保存
第2步:把文档改名为 test.html
第3步:将test.html这个文件拖到对应的三个tomcat中,拖到tomcat-8081/webapps/ROOT中,三个tomcat都拖一个文件
第4步:将test.html的文件内容,分别改成和tomcat目录名称对应的值
3,分别启动这3个tomcat,保证这3个tomcat都能访问
分别进入 3个tomcat的bin目录下,./startup.sh
cd /home/tomcat-8081/bin --> ./startup.sh
cd /home/tomcat-8082/bin --> ./startup.sh
cd /home/tomcat-8083/bin --> ./startup.sh
然后分别加上/test.html去访问对应的test页面
4,配置nginx
在server的外面加上
upstream tomcat1 {
server 192.168.100.160:8081;
server 192.168.100.160:8082;
server 192.168.100.160:8083;
}
#192.168.100.160 -> http://tomcat1 -> http://192.168.100.160:8081
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcat1;
#配置默认访问页,这里就会访问到tomcat1里面的那个index.jsp文件里面
index index.html;
}
}
加完后,保存退出,重新加载nginx
命令:cd /home/nginx/sbin
命令:./nginx -s reload
5,然后在浏览器中输入地址去访问
http://192.168.100.160/test.html
然后刷新访问地址,每次访问的时候都会随机出现不同的tomcat页面,这其实就完成了反向代理的使用
6,然后我们还可以重新配置一下,当我们访问指定页面的时候,只有指定的服务器可以使用
upstream tomcat1 {
server 127.0.0.1:8081;
}
upstream tomcat2 {
server 127.0.0.1:8082;
server 127.0.0.1:8083;
}
server {
listen 80;
server_name localhost;
location /1 {
proxy_pass http://tomcat1;
index index.jsp;
}
location /test.html {
proxy_pass http://tomcat2;
index index.jsp;
}
}
这个时候再次访问对应的地址,发现只有8082和8083可以访问我们指定的页面
#反向代理+负载均衡
upstream reverseProxyServer{
#负载均衡应用服务器A: 权重为10,10s内连接请求失败2次,nginx在10s内认为server是不可用的,将不在发送请求给这台服务器
server 应用服务器A的IP:8080 weight=10 max_fails=2 fail_timeout=10s;
#负载均衡应用服务器B: 代理服务器权重为5,10s内连接请求失败2次,nginx在10s内认为server是不可用的,将不在发送请求给这台服务器
server 应用服务器B的IP:8080 weight=5 fail_timeout=10s max_fails=2;
#负载均衡应用服务器C: 代理服务器权重为5,10s内连接请求失败2次,nginx在10s内认为server是不可用的,将不在发送请求给这台服务器
server 应用服务器C的IP:8080 weight=5 fail_timeout=10s max_fails=2;
}
server {
#监听80端口,http默认端口80
listen 80;
#服务器IP或域名
server_name localhost;
#反向代理请求路径中含有/appname的所有请求到upstream定义的对应反向代理模块
location /appname {
proxy_pass http://reverseProxyServer;
}
}
负载均衡算法常用的有轮询、权重和ip_hash算法,默认是轮询算法~
(1)基于轮询的算法
原理是每一个请求按时间顺序逐一被分发到不同的应用服务器,如果接收请求的应用服务器挂了,并且请求超过最大失败次数max_fails(1次),则在失效时间fail_timeout(10秒)内不会再转发请求到该节点~
upstream defaultReverseProxyServer{
server 192.168.0.1:8080;
server 192.168.0.2:8080;
}
(2)基于权重的算法
原理是每一个请求按权重被分发到不同的应用服务器,同样,如果接收请求的应用服务器挂了,并且请求超过最大失败次数max_fails(默认1次或可设置N次),则在失效时间fail_timeout(默认10秒,可设置N秒)内,不会再转发请求到该节点~
upstream weightReverseProxyServer{
server 192.168.0.1:8080 weight=10 max_fails=2 fail_timeout=5s;
server 192.168.0.2:8080 weight=5 max_fails=2 fail_timeout=5s;
}
(3)基于ip_hash的算法
原理是每一个请求按用户访问IP的哈希结果分配,如果请求来自同一个用户IP则固定这台IP访问一台应用服务器,该算法可以有效解决动态网页中存在的session共享问题。
upstream ipHashReverseProxyServer{
ip_hash;
server 192.168.0.1:8080;
server 192.168.0.2:8080;
}
一般使用的是基于权重的算法,因为现在很多情况下都是集群部署,而且集群下的各个服务器资源大多都是不均匀的,资源高的则分配权重高一些,资源低的则分配权重低一些,这种情况使用基于权重的负载均衡算法,可以更高效的利用资源和提高并发处理能力~