Nginx网络代理

Nginx网络代理

Nginx 特点是占有内存少,并发处理能力强,以高性能、低系统资源消耗而闻名,Nginx官方测试为5万并发请求。

一、Nginx简介

1.1 Nginx应用场景

  • HTTP服务器:Nginx 本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用 Nginx 来做服务器,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。
  • FTP 服务器:FTP 服务器,通常会提供一个上传的功能,其他应用如果需要静态资源就从该静态服务器中获取。
  • 反向代理:反向代理 (Reverse Proxy) 方式是指以代理服务器来接受 inter*** 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 inter*** 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
  • 负载均衡:负载均衡也是 Nginx 常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如 Web 服务器、FTP 服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

1.2 Nginx优点

  • 高并发支持:单机能够支持 10W + 的并发连接 (取决于内存大小,极限能够到百万),那么在实际生产中也是非常能接近这个数字的,这主要得益于 nginx 在 linux 环境下使用了 epollIO 多路复用模型。
  • 内存消耗低:在同类型 web 服务中,nginx 比 apache 占用的内存资源更少,在一般情况下 10K 非活跃的 HTTP Keep-Alive 连接在 nginx 中仅消耗 2.5M 内存。
  • 高扩展性:低耦合的模块设计,并且有丰富的第三方模块支持。
  • 高可靠性:经过十几年各种复杂场景和各大公司的生产环境验证,并且 nginx 的架构是由 master 进程和 worker 进程组成的,如果 worker 进程出现问题,那么 master 进程可以快速开启一个新的 worker 进程提供服务。

1.3 正向代理与反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受inter***上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给inter***上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器;

正向代理类似一个跳板机,代理访问外部资源。比如:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器,它能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。

综上所述:正向代理代理对象是客户端,反向代理代理对象是服务端。

二、Nginx环境搭建

免费开源版的官方网站:

http://nginx.org

2.1 下载安装

2.1.1 安装前的库

// g***编译器是否安装
检查是否安装:yum list installed | grep g***
执行安装:yum install g*** -y
// openssl库是否安装
检查是否安装:yum list installed | grep openssl
执行安装:yum install openssl openssl-devel -y
// pcre库是否安装
检查是否安装:yum list installed | grep pcre
执行安装:yum install pcre pcre-devel -y
// zlib库是否安装
检查是否安装:yum list installed | grep zlib
执行安装:yum install zlib zlib-devel -y

2.1.2 正式安装

2.2 启动

2.2.1 普通启动

切换到nginx安装目录的sbin目录下,执行:./nginx

2.2.2 配置文件启动

./nginx -c /usr/local/nginx/conf/nginx.conf

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

其中-c是指定配置文件,而且配置文件路径必须指定绝对路径

2.2.3 检查nginx是否启动

ps -ef | grep nginx

nginx 体系结构由 master 进程和其 worker 进程组成;

master 进程读取配置文件,并维护 worker 进程,而 worker 进程则对请求进行实际处理;

2.3 关闭

2.3.1 优雅关闭Nginx

找出nginx的进程号:ps -ef | grep nginx

执行命令:kill -QUIT 主pid

2.3.2 快速关闭

找出nginx的进程号:ps -ef | grep nginx

kill -TERM 主pid
  • 其中pid是主进程号的pid(master process),其他为子进程pid(worker process);
  • 这种关闭方式不管请求是否处理完成,直接关闭,比较暴力,称之为快速的关闭;

2.3.3 查看nginx版本

Linux上查看nginx版本:/usr/local/nginx/sbin/nginx -V

-v (小写的v)显示 nginx 的版本

-V (大写的V)显示 nginx 的版本、编译器版本和配置参数

2.4 Nginx核心配置文件

2.4.1 基本配置

配置 worker 进程运行用户 nobody 也是一个 linux 用户,一般用于启动程序,没有密码
user nobody;

配置工作进程数目,根据硬件调整,通常等于 CPU 数量或者 2 倍于 CPU 数量 最好说是 6,取中间值
worker_processes 1;

配置全局错误日志及类型,[debug | info | notice | warn | error | crit],默认是 error
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

pid logs/nginx.pid; # 配置进程 pid 文件

2.4.2 events配置

配置工作模式和连接数
events {worker_connections 1024; # 配置每个 worker 进程连接数上限,nginx 支持的总连接数就等于              
        worker_processes * worker_connections
        
        取值上限是 65535
}

2.4.3 Http配置

配置 http 服务器,利用它的反向代理功能提供负载均衡支持
http {
    #配置 nginx 支持哪些多媒体类型,可以在 conf/mime.types 查看支持哪些多媒体类型
    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"';

    #配置 a***ess.log 日志及存放路径,并使用上面定义的 main 日志格式
    #a***ess_log logs/a***ess.log main;

    sendfile on; # 开启高效文件传输模式
    #tcp_nopush on; # 防止网络阻塞
    
    #keepalive_timeout 0;
    keepalive_timeout 65; # 长连接超时时间,单位是秒

    #gzip on; # 开启 gzip 压缩输出
}

2.4.4 server配置

# 配置虚拟主机
server {
    listen 80; # 配置监听端口
    server_name localhost; # 配置服务名 两个主机不能服务号和端口号完全一致

    #charset koi8-r; # 配置字符集

    #a***ess_log logs/host.a***ess.log main; # 配置本虚拟主机的访问日志

    #默认的匹配斜杠 / 的请求,当访问路径中有斜杠 /,会被该 location 匹配到并进行处理

    location / {
        # root 是配置服务器的默认网站根目录位置,默认为 nginx 安装主目录下的 html 目录
        root html;
        # 配置首页文件的名称
        index index.html index.htm;
    }

    #error_page 404     /404.html; # 配置 404 页面
    #redirect server error pages to the static page /50x.html
    #error_page 500 502 503 504 /50x.html; # 配置 50x 错误页面

    #精确匹配
    location = /50x.html {
        root html;
    }
}

三、nginx的主要应用

3.1 静态网站部署

通过 http://192.168.235.128:80/ 访问

# 修改nginx.conf配置文件
location / {
    root /opt/static/ace;
    index index.html index.htm;
}

通过 http://192.168.235.128:80/ace/ 访问

# 修改nginx.conf配置文件
location / {
    root html;
    index index.html index.htm;
}

# 接收/ace请求,去opt/static下找资源
location /ace {
    root /opt/static;
    index index.html index.htm;
}

3.2.1 location配置路径详解

ip + port 等于 root

1. location匹配规则:

        nginx服务器首先在server块的多个location块中搜索是否有标准的uri和请求字符串匹配。如果有多个标准uri可以匹配,就匹配其中匹配度最高的一个location。

        nginx在使用location块中,正则uri和请求字符串,进行匹配。如果正则匹配成功,则结束匹配,并使用这个location处理请求;如果正则匹配失败,则使用标准uri中,匹配度最高的location。

四、负载均衡

负载均衡通常是指将请求"均匀"分摊到集群中多个服务器节点上执行,这里的均匀是指在一个比较大的统计范围内是基本均匀的,并不是完全均匀。

4.1 Nginx负载均衡

Nginx通过在 nginx.conf 文件进行配置即可实现负载均衡;

4.1.1 http模块配置

upstream www.myweb.*** { 
     server  127.0.0.1:9100 weight=3; 
     server  127.0.0.1:9200 weight=1;  
} 

其中weight=1表示权重,用于后端服务器性能不均的情况,访问比率约等于权重之比,权重越大访问机会越多; 但是权重并不代表紧着9100接收,而是采用less_conn的方式进行接收;

upstream是配置nginx与后端服务器负载均衡非常重要的一个模块,并且它还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器;

4.1.2 server模块中添加location,并配置proxy_pass

location /myweb{
    proxy_pass http://www.myweb.***
}

// 其中 www.myweb.*** 字符串要和 upstream 后面的字符串相等

// proxy_pass 后面的 URL 就是 “真正处理请求的服务器地址”

4.1.3 重启nginx

ps -ef | grep nginx
// 查看进程


/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -t
// 检查配置文件的格式等问题


/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
// 重启nginx

./nginx -s reload

4.2 常用负载均衡策略

4.2.1 轮询(默认)

轮询并不是每个请求轮流分配到不同的后端服务器,ip_hash类似,但是按照访问urlhash结果来分配请求,使得   每个url 定向到同一个后端服务器 ,主要应用于后端服务器为缓存时的场景下如果后端服务器down掉,将自动剔除;   

按照请求的先后顺序,依次将请求分配到不同的后端服务器,是 Nginx 默认的负载均衡策略。

不具备会话保持能力,同一客户端的不同请求可能被分配到不同服务器。

upstream backserver { 
    server 127.0.0.1:8080;
    server 127.0.0.1:9090;
}

4.2.2 权重

每个请求按一定比例分发到不同的后端服务器,weight值越大访问的比例越大,用于后端服务器性能不均的情况;

upstream backserver { 
    server 192.168.0.14 weight=5; 
    server 192.168.0.15 weight=2; 
} 

4.2.3 ip_hash

ip_hash也叫IP绑定,每个请求按访问 ip 的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失的问题;

4.2.4 最少连接

web请求会被转发到连接数最少的服务器上

4.2.5 负载均衡的其他配置

一般在项目上线的时候,可以分配部署不同的服务器上,然后对Nginx重新reload。

reload不会影响用户的访问,或者可以给一个提示页面,系统正在升级...

五、静态代理

把所有静态资源的访问改为访问nginx,而不是访问tomcat,这种方式叫静态代理。

因为nginx更擅长于静态资源的处理,性能更好,效率更高。

将静态资源比如图片、css、html、js等交给nginx处理,而不是由tomcat处理。

5.2 Nginx静态代理实现方式

5.2.1 nginx.conf的location中配置静态资源后缀

当访问静态资源,则从linux服务器 /opt/static 目录下获取:

5.2.2 nginx.conf的location中配置静态资源所在目录

当访问静态资源,则从linux服务器 /opt/static 目录下获取:

将静态资源放入 /opt/static 目录下,然后用户访问时由nginx返回这些静态资源;

6. 动静分离

Nginx的负载均衡和静态代理结合在一起,可以实现动静分离。

动态资源,如jsp由tomcat或其他web服务器完成;

静态资源,如图片、css、js等由nginx服务器完成;

它们各司其职,专注于做自己擅长的事情;

动静分离充分利用了它们各自的优势,从而达到更高效合理的架构。

一个nginx负责负载均衡,两个nginx负责静态代理。

Nginx在一台Linux上安装一份,可以启动多个Nginx,每个Nginx的配置文件不一样即可;

7. 虚拟主机

虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,这样一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站。

Nginx提供虚拟主机的功能,就是为了不需要安装多个Nginx,就可以运行多个域名不同的网站。

Nginx下,一个server标签就是一个虚拟主机。nginx的虚拟主机就是通过nginx.conf中server节点指定的,想要设置多个虚拟主机,配置多个server节点即可;

例如:www.meituan.*** 切换城市,可以看到不同的城市地址不一样(二级域名)

比如一个公司有多个二级域名,没有必要为每个二级域名都提供一台Nginx服务器,就可以使用虚拟主机技术,在一台nginx服务器上,模拟多个虚拟服务器。

7.1 配置虚拟主机方式

7.1.1 基于端口的虚拟主机

基于端口的虚拟主机配置,使用端口来区分;

浏览器使用 同一个域名+端口 或 同一个ip地址+端口访问;

7.1.2 基于域名的虚拟主机

7.2 配置虚拟主机流程

通过 Nginx 配置虚拟主机,实现不同域名(beijing.myweb.***nanjing.myweb.***tianjin.myweb.***)分别转发到对应端口的 Tomcat 服务器,达成域名与后端服务的绑定访问。

流程逻辑总结

  1. 先部署后端 Tomcat,确保每个站点独立可访问;
  2. 配置 Nginx 的upstream,定义域名与 Tomcat 端口的映射;
  3. 配置虚拟主机(server节点),让 Nginx 根据域名转发请求到对应的upstream
  4. 通过本地hosts文件解析域名到 Nginx 服务器 IP;
  5. 重启 Nginx 后,通过域名访问验证转发效果。
转载请说明出处内容投诉
CSS教程网 » Nginx网络代理

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买