nginx的正向代理和反向代理
正向代理以及缓存配置:
代理:客户端不再是直接访问服务端,通过代理服务器访问服务端
正向代理:面向客户端,我们通过代理服务器的IP地址访问目标服务端。
服务端只知道代理服务器的地址,真正的客户端ip可以隐藏。(科学上网)
设置缓冲区域为256个,大小为4K
proxy_max_temp_file_size 0
#nginx服务器作为代理的时候,暂时存放的响应数据数据最大临时文件的大小为0,0表示不使用临时文件
proxy_cache_valid 200 302 1m;
#当状态码是200和302时,缓存的有效期间是一分钟
proxy_cache_valid 301 1h;
#当状态码是301,缓存有效期1小时
proxy_cache_valid any 1m;
#除了上述的状态码返回值之外,其他的缓存保存时间为1m;
)
server {listen 8888;server_name localhost;resolver 8.8.8.8 valid=300 ipv6=off;#设置dns解析地址,解析器的缓存时间300秒,每300秒重新解析一次,关闭ipv6resolver_timeout 3s;#解析超时的时间3秒proxy_read_timeout 30s;#读取代理服务器的超时时间,30s,默认是60s.proxy_send_timeout 30s;#向服务端发送数据的超时时间是30s,默认是60s.proxy_connect_timeout 30s;#和服务器建立连接的超时时间,30s,默认也是60scharset utf-8;#access_log logs/host.access.log main;location / {root html;index index.html index.htm;proxy_pass $scheme://$http_host$request_uri;proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_set_header X-Forwarded-Host $host;proxy_set_header X-Forwarded-Port $server_port;#需要把客户端的真实ip,客户端的主机名,客户端的请求方式,服务端的端口,真实的ip地址添加在请求头当中# 请求转发到$url的地址,通过代理服务器地址可以直接访问百度 http://$url:端口# 设置页面的缓存:proxy_buffers 256 4k;#设置缓冲区为256个,大小是4kproxy_max_temp_file_size 0;# nginx服务器做为代理的时候暂时存放的响应数据的最大临时文件的大小为0,不使用临时文件proxy_cache_valid 200 302 1m;#当状态吗是200和302时,缓存的有效期是1分钟proxy_cache_valid 301 1h;#当状态吗是301,缓存的有效期是1小时proxy_cache_valid any 1m;#除了上述的三个状态吗,其他的缓存保存时间1分钟。}
反向代理
正向代理我们是知道代理服务器的地址,也知道我们访问的web服务器。
反向代理,客户端还是访问的代理地址,但是具体的访问web服务器是哪一台,我们并不知道:
作用:请求分配到多个后台服务器上,分担服务器的负载,提供系统的可用性和稳定性
缓存加速
安全保护
四层代理和七层代理之间的区别
正向代理,http模块的server和location
http模块配置的都是七层
七层就是应用层,使用的是http协议,可以请求进行解析和处理,七层代理走的是用户态,应用协议和程序功能。
七层的处理速度相对比较慢,但是可以提供更高级的功能和更好的用户体验。
既可以是域名也可以是IP+端口
四层是传输层,ip+端口,请求转发到后端,无法对请求进行深入的解析和处理,只是对请求流量的转发
四层转发是内核态,内核处理,内核转发,速度较快
应用场景:七层代理,一般都是对外提供访问,需要对请求进行处理。包含安全,过滤,流量控制。
四层代理,一般内部使用,不需要对流量,请求做特殊处理
反向代理=负载均衡
配置方法:
七层只能写在http模块当中,命令为 upstream, 只能在http的大模块中,不能写在server,也不能在location中
四层只能写在全局配置当中,不能在http模块 stream
test2 192.168.11.137 代理—配置反向代理
test3 192…168.11.138 后台服务器
test4 192.168.11.139 后台服务器
客户端:谷歌浏览器
负载均衡算法:
1、轮询 round robin rr :轮询算法是最简单也是最基础算法,也是默认算法。请求轮流分配到后端服务器。
轮询算法适用于后端服务器处理能力相同的情况。而且访问量不大的情况,默认算法,可以不加
2、加权轮询:在轮询的基础之上,给每个后端服务器设置不同的权重。 流量的分配不一定是按照权重比来,
权重高的被轮询的概率大,权重低的相对较小。
后端的服务器的性能有差异,性能高,权重想对更高,性能低,权重相对小一些。
weight
http {upstream xy102 {server 192.168.11.138 weight=3;server 192.168.11.139 weight=2;}
}server {listen 80;server_name localhost;location / {root html;index index.html index.htm;proxy_pass http://xy102;}
3、最小连接数算法,配合加权使用
least_conn 会把请求发送到当前连接数较少的后端服务器。
后端服务器处理任务耗时情况不同的情况,可以避免请求集中在处理能力更强的服务器上。
4、ip_hash*怎么做会话保持?
ip_hash根据算法,计算客户端的IP地址的hash值,然后将请求转发到响应的服务器。
在第一次访问网站的时候,就会计算hash值,会请求分到一个服务器,但是下一次客户端如果使用相同IP地址再次访问就不会再分配到其他服务器,除非后台服务器的算法变更,或者后台的服务器发送变化,这是才会更改访问的服务器。
**使用场景:高并发 ** 如果客户端进来不停地轮换服务器,反而会加重服务器的负担,固定在一台服务器上,既降低了代理服务器的压力,同时也节约了资源
nginx当中如何实现会话保持?
ip_hash可以实现会话保持
sessionc 动态页面里面配置会话。
5、URL_hash 根据请求的URL地址寻址hash值,然后再转发,如果每次请求的URL都一致,就会分配到同一个服务器,转发的地址发生变化,后台服务器清理缓存或者后台服务器数量发生变化。
http {
upstream xy102 {hash $request_uri consistent;server 192.168.11.138 weight=4;server 192.168.11.139 weight=2;}
}
以上都是在七层当中使用的,四层没有ip_hash 和 url_hash算法
实验:
基于域名实验负载均衡给每个主机设置服务域名,去/etc/hosts中进行域名映射,重启nginx服务,进入虚拟机测试。
test2 192.168.11.137 客户端 www.xy33.com
test3 192..168.11.138 后台服务器 www.xy11.com
test4 192.168.11.139 后台服务器 www.xy22.com[root@test2 conf]# vim nginx.conf
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream xy102 {server www.xy11.com weight=4;server www.xy22.com weight=2;}server {listen 80;server_name www.xy33.com;}
[root@test2 conf]# vim /etc/hosts
192.168.11.137 www.xy33.com
192.168.11.138 www.xy11.com
192.168.11.139 www.xy22.com[root@test3 conf]# vim nginx.confserver {listen 80;server_name www.xy11.com;}[root@test3 conf]# vim /etc/hosts
192.168.11.137 www.xy33.com
192.168.11.138 www.xy11.com
192.168.11.139 www.xy22.com[root@test4 conf]# vim nginx.confserver {listen 80;server_name www.xy22.com;}[root@test4 conf]# vim /etc/hosts
192.168.11.137 www.xy33.com
192.168.11.138 www.xy11.com
192.168.11.139 www.xy22.com
四层代理:
配置方式只能在全局模块,算法比较少,只能是ip+端口
test2 192.168.11.137 客户端 192.168.11.137:81
test3 192..168.11.138 后台服务器 192.168.11.138:8081
test4 192.168.11.139 后台服务器 192.168.11.139:8082
客户端配置页面负载均衡搞的[root@test2 conf]# vim nginx.conf
events {worker_connections 1024;
}
stream {upstream test {server 192.168.11.138:8081 weight=2;server 192.168.11.139:8082 weight=2;}server {listen 81;proxy_pass test;
}
}[root@test3 conf]# vim nginx.conf#keepalive_timeout 0;keepalive_timeout 65;#gzip on;server {listen 8081;[root@test4 conf]# vim nginx.conf#keepalive_timeout 0;keepalive_timeout 65;server {listen 8082;
nginx优化
nginx的location的匹配和优先级以及重定向
nginx的正向代理和反向代理
tomact
tomcat和PHP一样,都是用来处理动态页面的。
tomcat也可以作为web应用服务器,开源的。
PHP处理的是 .php
nginx .html
tomcat .jsp
tomcat是用Java代码写的程序,运行的是Java的web应用程序
tomcat的特点和功能:
1、service容器:执行Java servlet 服务端的Java程序,处理客户端的http请求,以及响应。
2、jsp容器 Javasever page 这是一种动态页面的技术,也可以在html的页面里面嵌入的Java代码
3、自身也是一个http服务器
4、tomcat是一个轻量级的动态页面,高并发场景不使用。
tomcat优化:tomcat自身的优化,以及系统内核优化,jvm优化。
**servlet :**是Java语言中用来开发web应用程序的关键组件。
处理http请求,生产动态内容以及响应客户端的请求。
处理http请求
生成动态内容
处理Java的业务逻辑
会话管理,保持用户的状态信息,购物车同步,用户登录等等
也可以转发nginx的动态请求到数据库
jsp:
web应用程序的界面,这个界面的语言是用Java实现的。
.jsp为结尾的文件
index.jsp
tomcat的组件:
connector:负责对外接受和响应请求,它是tomcat于客户端沟通的一个枢纽,监听端口接受外界请进行处理,处理完成之后回到connector,再响应客户端
connector:负责处理业务逻辑 ,engin host context wrapper 四个功能组成
engine:管理多个虚拟主机。一个service只有一个engine,一个engine可以有多个host
host:一个host就是一个主机,也可以叫站点,通过配置host,可以添加多个站点
context:一个context代表一个web应用
wrapper:封装器,用来负责处理最底层的逻辑
service:对外提供外部服务,包含connector和container
tomcat可以有多个service,每个service互相独立的。
tomcat目录的作用:
1、bin 存放启动和关闭tomcat脚本的文件。startup.sh shutdown.sh
2、conf 存放tomcat的主配置文件,server.xml主配置文件 context.xml:host的默认配置信息
tomcat-user.xml:登录时认证用户和密码的相关信息。manager文件必须赋权修改之后才能打开
3、lib:tomcat运行时需要的jar包。一般不动
4、logs:日志文件,catalina.out 主日志文件
5、temp:存放tomcat运行时产生的文件。
6、webapps:部署web应用的目录,类似于nginx的html
------主要目录说明----------------------------------------------------------------------------------------------
●bin:存放启动和关闭Tomcat的脚本文件,比较常用的是 catalina.sh、startup.sh、shutdown.sh三个文件
●conf:存放Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四个文件。
① server.xml: Tomcat的主配置文件,包含Service,Connector,Engine,Realm,Valve,Hosts主组件的相关配置信息;
② context.xml:所有host的默认配置信息;
③ tomcat-user.xml:Realm认证时用到的相关角色、用户和密码等信息,Tomcat自带的manager默认情况下会用到此文件,在Tomcat中添加/删除用户,为用户指|定角色等将通过编辑此文件实现;
④ web.xml:遵循Servlet规范标准的配置文件,用于配置servlet,并为所有的web应用程序提供包括MIME映射等默认配置信息;
●lib:存放Tomcat运行需要的库文件的jar 包,一般不作任何改动,除非连接第三方服务,比如 redis,那就需要添加相对应的jar 包
●logs:存放 Tomcat 执行时的日志
●temp:存放 Tomcat 运行时产生的文件
●webapps:存放 Tomcat 默认的 Web 应用部署目录
●work:Tomcat工作日录,存放jsp编译后产生的class文件,一般清除Tomcat缓存的时候会使用到
●src:存放Tomcat 的源代码
●doc:存放Tomcat文档
----------------------------------------------------------------------------------------------------------查看manager文件:
cd /usr/local/tomcat/webapps/manager/META-INF
vim context.xml<Context antiResourceLocking="false" privileged="true" ><Valve className="org.apache.catalina.valves.RemoteAddrValve"allow=".*" /> #允许所有主机访问。在conf,tomcat-users.xml中,添加账户密码
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/>
---------------------Tomcat 虚拟主机配置-------------------------
很多时候公司会有多个项目需要运行,一般不会是在一台服务器上运行多个 Tomcat 服务,这样会消耗太多的系统资源。此时, 就需要使用到 Tomcat 虚拟主机。
例如现在新增两个域名 www.kgc.com 和 www.benet.com, 希望通过这两个域名访问到不同的项目内容。1.创建 kgc 和 benet 项目目录和文件
mkdir /usr/local/tomcat/webapps/kgc
mkdir /usr/local/tomcat/webapps/benet
echo "This is kgc page\!" > /usr/local/tomcat/webapps/kgc/index.jsp
echo "This is benet page\!" > /usr/local/tomcat/webapps/benet/index.jsp2.修改 Tomcat 主配置文件 server.xml
vim /usr/local/tomcat/conf/server.xml
--165行前--插入
<Host name="www.kgc.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/kgc" path="" reloadable="true" />
</Host> <Host name="www.benet.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/benet" path="" reloadable="true" />
</Host>----------------------------------------------------------------------------------------------------------
Host name:主机名
appBase:Tomcat程序工作目录,即存放web应用程序的目录;相对路径为webapps,绝对路径为 /usr/local/tomcat/webapps
unpackWARs:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true
autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true
xmlValidation:是否验证xml文件执行有效性检验的标志
xmlNamespaceAware:是否启用xml命名空间,设置该值与xmlValidation为true,表示对web.xml文件执行有效性检验docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;
path:相对于Web服务器根路径而言的URI;如果为空“”,则表示为此webapp的根路径 / ;
reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false
---------------------Tomcat 服务部署-------------------------
在部署 Tomcat 之前必须安装好 jdk,因为 jdk 是 Tomcat 运行的必要环境。
1.关闭防火墙,将安装 Tomcat 所需软件包传到/opt目录下
jdk-8u201-linux-x64.rpm
apache-tomcat-9.0.16.tar.gzsystemctl stop firewalld
systemctl disable firewalld
setenforce 02.安装JDK
cd /opt
rpm -ivh jdk-8u201-linux-x64.rpm
java -version3.设置JDK环境变量
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATHexport JAVA_HOME=/usr/java/jdk1.8.0_201-amd64:
这个命令设置了一个名为JAVA_HOME的环境变量,它指向Java JDK的安装路径。
这对于告诉系统和其他应用程序Java的安装位置非常重要。你需要将路径替换为你实际安装Java的路径。export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:
这个命令设置了一个名为CLASSPATH的环境变量,它用于指定Java类的搜索路径。
在这个命令中,.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar 表示当前目录(.)
以及Java工具库(tools.jar)和Java远程调试库(dt.jar)的路径。这些库通常包含一些Java开发所需的类。export PATH=$JAVA_HOME/bin:$PATH:
这个命令将Java可执行文件的路径添加到系统的PATH环境变量中。
这使得你可以在终端中直接运行Java工具,而不需要输入完整的路径。
这将Java的bin目录添加到了PATH中,使得java、javac等命令可以直接运行。source /etc/profile.d/java.sh
java -version----------------------------------------------------------------------------------------------------------
CLASSPATH:编译、运行Java程序时,JRE会去该变量指定的路径中搜索所需的类(.class)文件。
dt.jar:是关于运行环境的类库,主要是可视化的 swing 的包。
tools.jar:主要是一些jdk工具的类库,包括javac、java、javap(jdk自带的一个反编译工具)、javadoc等。
JDK (Java Development Kit):JDK是Java开发工具包,它是用于开发Java应用程序的软件包。
JDK包括了编译器(javac)、调试器、各种工具、Java标准类库(Java API)、以及Java文档等。
JDK是开发者用来创建、编译和运行Java应用程序的重要组件。JRE (Java Runtime Environment):JRE是Java运行时环境,它是用于执行Java应用程序的部分。
JRE包括了Java虚拟机(JVM)以及Java类库(Java API),这使得用户能够在计算机上运行已编译的Java程序,
而不需要进行开发。JRE是终端用户需要安装的部分,以便能够运行Java应用程序。JVM (Java Virtual Machine):JVM是Java虚拟机,它是Java应用程序在计算机上运行的核心组件。
JVM负责将编译后的Java字节码(.class文件)解释或编译成本地机器码,以便计算机能够执行它。
JVM提供了内存管理、垃圾回收、线程管理等功能,以确保Java程序在不同平台上具有相似的行为。
----------------------------------------------------------------------------------------------------------首先使用文本工具编写java源代码,比如 Hello.java ;
在命令行中,输入命令:javac
首先使用文本工具编写java源代码,比如 Hello.java ;
在命令行中,输入命令:javac Hello.java,对源代码进行编译,生成 class 字节码文件;
编译完成后,如果没有报错信息,输入命令:java Hello,运行 class 字节码文件,由 JVM 对字节码进行解释和运行,
打印 “Hello World”。vim Hello.javapublic class Hello { public static void main(String[] args){System.out.println("Hello world!");}
}javac Hello.java
java Hellopublic: 这是一个访问修饰符,表示类是公共的,可以从其他地方访问。
class: 关键字用于定义一个类。
Hello: 这是类的名称,这里是一个叫做 "Hello" 的类。public static void main(String[] args){
public: 访问修饰符,表示这个方法是公共的,可以从其他地方访问。
static: 静态修饰符,表示这个方法属于类而不是实例,可以通过类名直接调用。
void: 这是方法的返回类型,void 表示方法没有返回值。
main: 这是方法的名称,是程序的入口点,当程序运行时会从这里开始执行。
(String[] args): 这是方法的参数列表,args 是一个字符串数组,可以在命令行传递参数给程序。System.out.println("Hello world!");
System.out: System 是一个类,out 是这个类的一个静态成员,它代表标准输出流。
println: 这是输出方法的名称,它会在控制台输出一行内容。
"Hello world!": 这是要输出的内容,是一个字符串。4.安装启动Tomcat
cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
##启动tomcat ##
#后台启动
/usr/local/tomcat/bin/startup.sh
或
/usr/local/tomcat/bin/catalina.sh start#前台启动
/usr/local/tomcat/bin/catalina.sh run netstat -natp | grep 8080浏览器访问Tomcat的默认主页 http://192.168.233.21:80805.优化tomcat启动速度
第一次启动tomcat可能会发现 Tomcat 启动很慢,默认情况下可能会需要几十秒,可以修改jdk参数进行改。
vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
--117行--修改
securerandom.source=file:/dev/urandom
----------------------------------------------------------------------------------------------------------
/dev/urandom是/dev/random的非阻塞版本,/dev/random的 random pool 依赖于系统中断,因此在系统的中断数不足时,
/dev/random 设备会一直封锁,尝试读取的进程就会进入等待状态,直到系统的中断数充分够用,
/dev/random设备可以保证数据的随机性。 /dev/urandom不依赖系统的中断,也就不会造成进程忙等待,
但是数据的随机性也不高,所以该随机数的安全性理论上不高。如果应用对安全性要求很高,那么应该使用/dev/random。
Tomcat 启动很慢,默认情况下可能会需要几十秒,可以修改jdk参数进行改。
vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
–117行–修改
securerandom.source=file:/dev/urandom
/dev/urandom是/dev/random的非阻塞版本,/dev/random的 random pool 依赖于系统中断,因此在系统的中断数不足时,
/dev/random 设备会一直封锁,尝试读取的进程就会进入等待状态,直到系统的中断数充分够用,
/dev/random设备可以保证数据的随机性。 /dev/urandom不依赖系统的中断,也就不会造成进程忙等待,
但是数据的随机性也不高,所以该随机数的安全性理论上不高。如果应用对安全性要求很高,那么应该使用/dev/random。