〇,环境准备
* 一台Nginx服务器
* 三台虚拟机,此处以Tomcat页面演示
* 在nginx.conf配置文件的http模块,include自定义配置模块进行处理
http {
include mime.types;
default_type application/octet-stream;
#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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
# 引入自定义配置块
include /usr/develop/nginx/selfconf/self_nginx_conf
}
* 配置需要引入的配置模块
* 启动nginx,访问主页
一,反向代理
* 在server.location标签下配置如下信息
// 代理到host:port链接
location / {
proxy_pass http://192.168.91.129:8080;
}
* 配置完成后重启nginx
./sbin/nginx -s reload
* 访问首页
* 通过添加请求头信息,显示正确IP地址
-- nginx配置请求头信息
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://192.168.91.129:8080;
# 填充请求头信息
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 在指定情况下进行请求转发
proxy_next_upstream error timeout http_500 http_503;
# 请求超时时间
proxy_connect_timeout 60s;
# 发送/读取数据超时时间
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
* jsp页面通过request获取请求头信息
<h2><%=request.getRemoteAddr()%></h2>
<h2><%=request.getHeader("X-Real-IP")%></h2>
<h2>192.168.91.129</h2>
* 页面显示
二,负载均衡
* 配置upstream信息,配置内容为需要负载的全部后台服务器
// tomcat表示该upstream名称,作为server.location引用标识
// max_fail : 最大失败次数
// fail_timeout : 最大失败次数后, 时间内 不再请求
// weight : 权重
upstream tomcat {
server 192.168.91.128:8080 max_fail=3 fail_timeout=60s weight=3;
server 192.168.91.129:8080;
server 192.168.91.130:8080;
}
* server.location引用upstream标签信息,修改proxy_pass请求路径
proxy_pass http://tomcat;
* 启动对应三台服务器上的Tomcat服务
* 重新加载配置服务查看负载情况
* nginx默认负载算法为轮询算法,可以对负载均衡算法进行配置,比如根据IP的HASH值取模处理
upstream tomcat {
ip_hash;
server 192.168.91.128:8080 max_fails=3 fail_timeout=60s weight=3;
server 192.168.91.129:8080;
server 192.168.91.130:8080;
}
* 服务请求发送到130服务器上
三,动静分离
* 静态资源类型查看
vim ./conf/mime.types
* 动静分离配置,增加location模块,根据正则匹配静态资源信息。静态资源块配置后,正则匹配到的静态资源,不在从对应服务器获取静态资源信息,而直接从配置的静态资源存储位置获取信息。首先,不移动静态资源,进行页面查看
location ~ .*\.(js|css|png|svg|ico|jpg)$ {
# 动静分离后, 静态资源存储位置
root /usr/develop/nginx/static;
}
* 页面信息,从下图可以看到,js、css、png,jpg等配置的拦截信息全部丢失
* 添加配置信息配置的文件位置,并复制Tomcat所需的静态资源
// 创建文件夹
[root@localhost nginx]# mkdir static
// 进入到Tomcat静态资源存在的路径
[root@localhost nginx]# cd /usr/develop/apache-tomcat-7.0.91/webapps/ROOT/
// 复制文件
[root@localhost ROOT]# cp *.png *.ico *.svg *.js *.css *.jpg /usr/develop/nginx/static/
* 重新刷新页面
* 静态资源缓存:静态资源存为变更比较少的资源,可以进行资源缓存
location ~ .*\.(js|css|png|svg|ico|jpg)$ {
# 动静分离后, 静态资源存储位置
root /usr/develop/nginx/static;
# 静态资源缓存处理
expires 1d;
}
四,静态压缩
* 部分静态资源文件较大,通过压缩传输可以减少网络传输
* 静态压缩在http模块进行配置,此处不在自定义模块进行处理,直接在nginx.conf进行
# 打开文件压缩功能
gzip on;
# 最小压缩长度
gzip_min_length 5k;
# 压缩等级
gzip_comp_level 3;
# 要压缩的文件类型
gzip_types application/javascript image/jpeg image/svg+xml;
# 压缩缓冲区, 按照原数据32位的4倍申请缓冲区
gzip_buffers 4 32k;
# 开启浏览器是否支持压缩判断
gzip_vary on;
* 上述配置信息对svg文件有压缩处理,可以看到刚才打开的页面,存在svg文件,文件大小位26.9kb
* 配置压缩信息重新加载后,刷新页面,文件只有9.2kb
五,防盗链
* 互联网是一个公开的环境,存在部分资源的互相引用,比如图片或者文件信息,但是要保证服务请求是自己服务器发送的请求,就需要添加防盗链进行处理
* 防盗链信息配置与动静分离配置位置一致
location ~ .*\.(js|css|png|svg|ico|jpg)$ {
# 防盗链
valid_referers none blocked 192.168.91.129;
# 防盗链拦截后返回提示信息
if ($invalid_referer) {
return 404;
}
# 动静分离后, 静态资源存储位置
root /usr/develop/nginx/static;
# 静态资源缓存处理
expires 1d;
}
* 如配置信息所示,会对所有非129主机的服务进行静态资源拦截,并返回404;因为本机在129环境进行测试,所以修改主机为128,查看触发防盗链后的执行结果,可以看到下图中页面访问已经没有配置的拦截信息,且控制台css和png的访问已经报404错误码
六,跨域访问
* 取消Nginx反向代理的服务器,只保留130一台
upstream tomcat {
ip_hash;
# server 192.168.91.128:8080 max_fails=3 fail_timeout=60s weight=3;
# server 192.168.91.129:8080;
server 192.168.91.130:8080;
}
* 在130的tomcat根目录下创建test.txt文件(刚才未对txt文件进行拦截)
* 从页面直接通过130路径访问该文件
* 修改129的index.jsp,让其直接访问130下的test.txt文件
<head>
<title><%=request.getServletContext().getServerInfo() %></title>
<script src="jquery.js"></script>
<link href="favicon.ico" rel="icon" type="image/x-icon" />
<link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
<link href="tomcat.css" rel="stylesheet" type="text/css" />
<script>
$(function(){
$.get("http://192.168.91.129/test.txt", {}, function(result){
alert(result);
});
});
</script>
</head>
* 通过F12查看Console信息,可以看到,涉及跨域,请求失败
* 配置Nginx跨域请求信息,实现Nginx跨域访问;在自定义配置模块servce.location内配置
# Nginx解决跨域问题
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET,POST,DELETE';
add_header 'Aceess-Control-Allow-Header' 'Content-Type,*';
* 配合完成后重新刷新界面
七,附完整配置信息
*nginx.conf
http {
include mime.types;
default_type application/octet-stream;
#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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
include /usr/develop/nginx/selfconf/self_conf.conf;
# 打开文件压缩功能
gzip on;
# 最小压缩长度
gzip_min_length 5k;
# 压缩等级
gzip_comp_level 3;
# 要压缩的文件类型
gzip_types application/javascript image/jpeg image/svg+xml;
# 压缩缓冲区, 按照原数据32位的4倍申请缓冲区
gzip_buffers 4 32k;
# 开启浏览器是否支持压缩判断
gzip_vary on;
}
* self_conf.conf
upstream tomcat {
ip_hash;
# server 192.168.91.128:8080 max_fails=3 fail_timeout=60s weight=3;
# server 192.168.91.129:8080;
server 192.168.91.130:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcat;
# 填充请求头信息
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 在指定情况下进行请求转发
proxy_next_upstream error timeout http_500 http_503;
# 请求超时时间
proxy_connect_timeout 60s;
# 发送/读取数据超时时间
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# Nginx解决跨域问题
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET,POST,DELETE';
add_header 'Aceess-Control-Allow-Header' 'Content-Type,*';
}
location ~ .*\.(js|css|png|svg|ico|jpg)$ {
# 防盗链
valid_referers none blocked 192.168.91.129;
# 防盗链拦截后返回提示信息
if ($invalid_referer) {
return 404;
}
# 动静分离后, 静态资源存储位置
root /usr/develop/nginx/static;
# 静态资源缓存处理
expires 1d;
}
}