nginx 反向代理
注意:以下配置按照实际情况修改路径跟IP,如有问题自行百度
什么是nginx
? nginx是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好. nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达50000个并发连接数
反向代理
(1)正向代理
? 在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问
(2)反向代理
? 我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址
负载均衡
单个服务器解决不了,我们增加服务器的数量,将请求分发到各个服务器上,将原先的请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,就是负载均衡
动静分离
? 为了加快网站的解析速度,可以把动态页面可静态页面由不同的服务器来解析,加快解析速度.降低原来单个服务器的压力
nginx安装
#查看gcc版本
gcc -v
#安装 支持库
yum -y install gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
#下载nginx安装包
wget http://nginx.org/download/nginx-1.9.9.tar.gz
#解压
tar -zxvf nginx-1.9.9.tar.gz
#切换到安装目录执行命令
./configure
make
make install
#启动nginx 切换目录 /usr/local/nginx/sbin
./nginx
#nginx常用命令
#查看版本号
./nginx -v
#启动
./nginx
#关闭
./nginx -s stop
#重新加载
./nginx -s reload
nginx配置文件
(1)配置文件有三部分组成
第一部分 全局块
? 从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令
? 比如 worker_processes 1; 该值越大,可以支持的并发处理量也越多,受硬件、软件等设备制约
第二部分 events块
? events块涉及的指令主要影响nginx服务器与用户的网络连接
? 比如 worker_connections 1024; 支持的最大连接数
第三部分 http块
? nginx服务器配置中最频繁的部分
? http块包括http全局块、server块
nginx配置实例 - 反向代理
1.实现效果
? 打开浏览器,在浏览器地址输入localhost:80,跳转到linux系统tomcat主页中
2.准备工作
? 安装tomcat,使用默认端口8080
3.1反向代理配置
? 外网部署时,项目用到的端口都需要在防火墙中开放
? 在nginx.conf配置文件中 http块的server块中加入proxy_pass(启动nginx时注意重新加载)
server {
listen 80;
server_name localhost;
location / {
root html;
proxy_pass http://127.0.0.1:8080;
index index.html index.htm
}
}
3.2反向代理配置(配置同端口,不同地址,转发到指定tomcat项目)
tomcat配置规则:
? 第一种: 分别配置两个tomcat,指定端口号
? 第二种: 同tomcat,多个端口号
server {
listen 9000;
server_name localhost;
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
}
}
4.location指定说明
? 该指令用于匹配URL
? 语法如下
location [= | ~ | ~* | ^~] uri {
}
-
= : 用于不包含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求 -
~ : 用于表示uri包含正则表达式,并且区分大小写 -
~* : 用于表示uri包含正则表达式,并且不区分大小写 -
^~ : 用于不包含正则表达式的uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配 注意:如果uri包含正则表达式,则必须要有或者*标识
5.负载均衡实例
1.实现效果
? 浏览器地址栏输入地址 http://localhost:80,负载均衡效果,平均8080和8081端口中
2.准备工作
? 准备两台tomcat服务器,一台8080,一台8081(注意页面区分)
3.在nginx配置文件中进行负载均衡配置
http {
upstream myserver {
# 表示已进行负载均衡列表
ip_hash;
server 127.0.0.1:8080
server 127.0.0.1:8081
#server 127.0.0.1:8080 weight=1;
#server 127.0.0.1:8081 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://myserver;
proxy_connect_timeout 10;
}
}
}
4.nginx分配服务器策略
轮询(默认)
? 每个请求按时间顺序注意分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
weight
? weight代表权重默认为1,权重越高被分配的客户端越多
ip_hash
? 每个请求按访问ip的hash结果分配,这样每个方可固定访问一个后端服务器,可以解决session的问题(session共享问题)
fair(第三方)
? 按后端服务器的响应时间来分配请求,响应时间短的优先分配,负载均衡列表后加fair
6.动静分离实例
1.实现效果
? 单独用一台服务器做静态资源服务器
? 通过location指定不同的后缀名实现不同的请求转发.通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之间的请求和流量.具体expires定义:是给一个资源设定一个过期时间,也就是说无需去服务器端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量.此种做法非常适合不经常变动的资源.(如经常更新的文件,不建议使用expires来缓存),我这里设置3d,表示在这3天内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200
2.准备工作
? 在linux系统中准备静态资源,用于访问
? 根目录下创建data文件夹,在data目录创建image、www文件夹,分别在里面放入图片跟html文件
3.具体配置
server {
listen 80;
server_name localhost;
location /www/ {
root /data/;
index index.html index.htm;
}
location /image/ {
root /data/;
# 列出当前文件夹的内容
autoindex on;
}
}
4.测试
? 浏览器输入http://localhost:80/image/xx.jpg
? 浏览器输入http://localhost:80/www/index.html
7.高可用
1.实现效果
? 当服务器宕机,保证服务可用
2.准备工作
? 需要两台linux服务器 192.168.xx.xxx 和 192.168.17.131
? 在两台服务器安装nginx
? 在两台服务器安装keepalived(类似路由)
? 需要虚拟ip
3.安装keepalived
? yum install keepalived -y
? #查看版本
? rpm -q -a keepalived
? #安装目录
? cd /etc/keepalived
4.完成高可用配置(主从配置)
? cd /etc/keepalived
? 修改keepalived.conf文件,如下:
# 全局定义
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
# 按当前ip修改
smtp_server 192.168.200.1
smtp_connect_timeout 30
# 访问到主机(需要在host目录下某个文件配置 ip地址 LVS_DEVEL映射关系 自行百度)
# 或者直接写ip地址(192.168.xx.xxx)
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
# 检测脚本执行的间隔
interval 2
# 权重
weight 2
}
vrrp_instance VI_1 {
# 主服务器 (注意:从服务器上将 MASTER 改为 BACKUP)
state MASTER
# 网卡 (ifconfig命令行查看网卡,按显示的网卡修改)
interface ens33
# 主、备机的vivirtual_router_id必须相同
virtual_router_id 51
# 主、备机取不同优先级,主机值较大,备份机值较小
priority 100
# 每隔1秒发送一次心跳
advert_int 1
# 校验方式
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
# VRRP H虚拟ip地址 可绑定多个
192.168.200.16
192.168.200.17
}
}
? 编写检测脚本
? cd /usr/local/src
? vi nginx_check.sh
#!/bin/bash
A=`ps -C nginx -no-header |wc -1`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx -no-header |wc -1` -eq 0 ];then
killall keepalived
fi
fi
5.测试
? 启动nginx服务器: ./nginx
? 启动keepalived: systemctl start keepalived.service
? (1)在浏览器上输入虚拟ip地址 192.168.200.16
? (2)停掉主服务器,再输入虚拟ip地址 192.168.200.16
|