本文文字部分主要转自以下三篇文章。demo 为自己实现。
参考:https://www.cnblogs.com/FondWang/p/11666557.html
参考:https://www.cnblogs.com/wcwnina/p/8728391.html
参考:https://blog.csdn.net/qq_36125138/article/details/84144932
linux 下安装 nginx
- 下载
wget http://nginx.org/download/nginx-1.13.7.tar.gz - 安装
安装以下内容
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
解压 nginx-1.13.7.tar.gz 到 /root/nginx/nginx-1.13.7
进入 /root/nginx/nginx-1.13.7
执行 ./configure
执行 make
执行 make install
执行完上述命令后,nginx 被安装在 /usr/local/nginx
[root@shicai nginx]# ls /usr/local/nginx
conf html logs sbin
- 启动 nginx
cd /usr/local/nginx/sbin
./nginx
- 测试
$ curl 47.114.2.22:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
- 停止
/usr/local/nginx/sbin/nginx -s stop
- 重启
/usr/local/nginx/sbin/nginx -s reload
nginx 是什么
- 同 Apache 一样都是一种 WEB 服务器
- 基于 REST 架构风格,以统一资源描述符(Uniform Resources Identifier)URI或者统一资源定位符(Uniform Resources Locator)URL作为沟通依据,通过 HTTP 协议提供各种网络服务。
- 跨平台,可以运行在Linux,Windows,FreeBSD,Solaris,AIX,Mac OS等操作系统上
nginx 能做什么
- 正向代理
- 反向代理
- 负载均衡
- HTTP服务器(动静分离)
正向代理
- 客户端明确要访问的服务器地址
- 服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端
- 隐藏了真实客户端信息
- 客户端需设置:正向代理服务器的IP地址,和代理程序的端口
- 总之:“它代理的是客户端,代客户端发出请求”
正向代理的用途:
- 访问原来无法访问的资源,如Google
- 可以做缓存,加速访问资源
- 对客户端访问授权,上网进行认证
- 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
反向代理
- 客户端是明确的
- 请求具体由哪台服务器处理的不明确
- 反向代理服务器接收请求后,按照一定的规则分发给后端服务器
- 客户端不知道代理服务器存在
- 总之:“它代理的是服务端,代服务端接收请求”
反向代理的作用:
- 保证内网的安全,通常将反向代理作为公网访问地址
- 负载均衡
demo
- 启动被代理的后台服务
安装 java
rpm -ivh jdk9.rpm
启动两个后台进程,是两个 spring-boot demo 工程,
java -jar dockerdemo-1.jar &
java -jar dockerdemo-2.jar &
验证启动成功
[root@shicai ~]# curl 127.0.0.1:9090/hello
Hello Spring Boot!
[root@shicai ~]# curl 127.0.0.1:9091/hello
Another Hello Spring Boot!
- 设置反向代理并启动 nginx
修改 /usr/local/nginx/conf/nginx.conf 完整内容为
events {
worker_connections 1024;
}
http {
#设置反向代理
#注意,这里必须写成 nginx.demo,而不能写成 nginx_demo,否则会出现 HTTP Status 400 – Bad Request
upstream nginx.demo{
#设置负载均衡
server 127.0.0.1:9090 weight=5;
server 127.0.0.1:9091 weight=1;
}
#要代理的服务器信息
server {
listen 80;
location / {
#设置代理
proxy_pass http://nginx.demo;
}
}
}
- 测试
可见因为设置了权重,导向 127.0.0.1:9090 的请求明显更多。
[root@shicai conf] # curl 127.0.0.1:80/hello
Hello Spring Boot!
[root@shicai conf]# curl 127.0.0.1:80/hello
Hello Spring Boot!
[root@shicai conf]# curl 127.0.0.1:80/hello
Hello Spring Boot!
[root@shicai conf]# curl 127.0.0.1:80/hello
Hello Spring Boot!
[root@shicai conf]# curl 127.0.0.1:80/hello
Another Hello Spring Boot!
正向代理与反向代理区别
- 正向代理中,Proxy和Client同属于一个LAN(图中方框内),隐藏了客户端信息
- 反向代理中,Proxy和Server同属于一个LAN(图中方框内),隐藏了服务端信息
- Proxy在两种代理中做的事情都是替服务器代为收发请求和响应
负载均衡
-
轮询
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除 -
权重轮询
指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况 -
ip_hash
上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 -
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。 -
url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
HTTP服务器
Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现。
demo
修改 /usr/local/nginx/conf/nginx.conf 完整内容为
# 需要配置 user,否则会因为权限问题,访问 403,参考 https://www.jianshu.com/p/96632440a668
user root;
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name 127.0.0.1;
location / {
root /root/download_files;
index index.html;
}
}
}
- 测试
[root@shicai ~]# curl 127.0.0.1:80/hello.html
2
[root@shicai ~]# curl 127.0.0.1:80
1
$ curl http://47.114.2.22:80/hello.html
2
其中 index.html 的内容是 "1",hello.html 的内容是 "2"
动静分离
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。
这样我们就可以吧HTML以及图片和css以及js放到wwwroot目录下,而tomcat只负责处理jsp和请求,例如当我们后缀为gif的时候,Nginx默认会从wwwroot获取到当前请求的动态图文件返回,当然这里的静态文件跟Nginx是同一台服务器,我们也可以在另外一台服务器,然后通过反向代理和负载均衡配置过去就好了,只要搞清楚了最基本的流程,很多配置就很简单了,另外localtion后面其实是一个正则表达式,所以非常灵活。
demo
修改 /usr/local/nginx/conf/nginx.conf 完整内容为
user root;
events {
worker_connections 1024;
}
http {
upstream dynamic.server {
server 127.0.0.1:9090 weight=5;
server 127.0.0.1:9091 weight=1;
}
server {
listen 80;
location / {
proxy_pass http://dynamic.server;
}
location ~ .*\.(html|gif|jpg|png|bmp|swf|jpeg)$ {
root /root/download_files;
}
}
}
- 测试
[root@shicai ~]# curl 127.0.0.1:80/hello
Hello Spring Boot!
[root@shicai ~]# curl 127.0.0.1:80/hello.html
2