前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nginx入门系列之应用场景介绍

nginx入门系列之应用场景介绍

作者头像
编程随笔
发布2019-11-18 13:55:27
4110
发布2019-11-18 13:55:27
举报
文章被收录于专栏:后端开发随笔

目录

  • HTTP服务器
  • 反向代理服务器
    • 作为一个虚拟主机下多个应用的反向代理
    • 作为多个虚拟主机的反向代理
  • 负载均衡器
    • 简单轮训策略
    • 最小连接数策略
    • 客户端IP哈希策略
    • 服务器权重策略
  • 邮件代理服务器

官网:https://nginx.org/

nginx是一个高性能的http服务器,反向代理服务器,负载均衡器和邮件代理服务器。

HTTP服务器

nginx可以独立提供http服务,常用于静态网页服务器。 nginx作为http服务器时,支持虚拟主机,可以实现在一台服务器部署多个网站。

nginx作为http服务器
nginx作为http服务器

在nginx中配置虚拟主机非常方便,添加多个server块即可。 有2种方式配置多个server块:

方法1:直接在http块下配置多个server块

代码语言:javascript
复制
http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    # 配置虚拟主机1
    server {
        listen       80;
        server_name  localhost;

        charset koi8-r;
        access_log  /var/log/nginx/host.access.log  main;

        location / {
            # 网站1的根目录
            root   /usr/share/nginx/html/web1;
            index  index.html index.htm;
        }

        error_page  404               /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }

    # 配置虚拟主机2
    server {
        listen       81;
        server_name  localhost;

        charset koi8-r;
        access_log  /var/log/nginx/host.access.log  main;

        location / {
            # 网站2的根目录
           root   /usr/share/nginx/html/web2;
           index  index.html index.htm;
        }

        error_page  404               /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
}

如上所示,通过2个server块配置了2个虚拟主机(部署2个不同的网站),分别运行在2个不同的服务端口(80和81)。

方法2:将server块独立配置在不同的配置文件中,并通过include指令在http块中引用

代码语言:javascript
复制
http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    # 通过include指令引用不同的server配置
    include /etc/nginx/conf.d/*.conf;
}

如上所示,在nginx配置文件中通过include指令引用不同的server配置文件:将不同server块的配置分别放在不同的独立文件中。 例如,在“/etc/nginx/conf.d”下存在不同的server配置:web1.conf,web2.conf。

代码语言:javascript
复制
# web1.conf文件内容
server {
    listen       80;
    server_name  localhost;

    charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;

    location / {
        # 网站1的根目录
        root   /usr/share/nginx/html/web1;
        index  index.html index.htm;
    }

    error_page  404               /404.html;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

# web2.conf文件内容
server {
    listen       81;
    server_name  localhost;

    charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;

    location / {
        # 网站2的根目录
        root   /usr/share/nginx/html/web2;
        index  index.html index.htm;
    }

    error_page  404               /404.html;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

反向代理服务器

除了作为静态web服务器,作为后端应用的反向代理也是nginx最为常见的使用场景。

nginx作为反向代理
nginx作为反向代理

当nginx作为后端应用的反向代理时,充当的是后端应用的网关角色,即:所有到后端应用的请求都要经过nginx。 那么,为什么需要nginx作为后端应用的反向代理呢?大概有这些理由: 首先,nginx作为网关,可以对后端应用起到一定的保护作用,如:请求拦截可以直接在nginx这一层进行实现,避免非法请求进入到后端应用。 其次,如果后端应用支持水平伸缩,当进行集群化部署时,nginx作为统一访问入口,后端应用的变化无需客户端感知,起到解耦的作用。 再者,nginx本身的高性能,可以支撑相当量的并发。

配置nginx作为反向代理时,需要注意2个配置要点:

(1) 使用指令upstream指定一个后端应用组

(2) 在location块上指定需要设置反向代理的后端应用组名(或者访问地址)

nginx作为反向代理的完整配置模板如下所示:

代码语言:javascript
复制
http {
    # 使用upstream指令指定一个后端应用组
    upstream tomcat1 {
        server 192.168.56.103:8080;
    }

    server {
        # 在location块上设置反向代理
        localtion / {
            proxy_pass http://tomcat1/;
        }
    }
}

特别注意: 在配置反向代理时,如果location的映射地址不是“/”而是“/xxx”时,proxy_pass指令之后的访问地址末尾带“/”和不带“/”的效果是完全不一样的,具体来讲:

(1) 当location的映射地址为“/”时,proxy_pass指令指定的访问地址末尾带“/”和不带“/”的效果是一样的;

(2) 当location的映射地址为“/xxx”时,如果proxy_pass指令指定的访问地址末尾带“/”,那么在访问“/xxx”时,实际访问的就是目标服务器的根路径,即:“/”;

(3) 当location的映射地址为“/xxx”时,如果proxy_pass指令指定的访问地址末尾不带“/”,那么在访问“/xxx”时,实际访问的是目标服务器的“/xxx/”路径;

如下图详细说明了上述三种情况的实际表现:

nginx反向代理pass_proxy指令配置效果
nginx反向代理pass_proxy指令配置效果

实际上,nginx作为反向代理时,同一个nginx实例既可以作为一个虚拟主机下多个应用的反向代理,也可以作为多个虚拟主机的反向代理。

作为一个虚拟主机下多个应用的反向代理

nginx作为一个虚拟主机下多个应用的反向代理
nginx作为一个虚拟主机下多个应用的反向代理

当nginx作为同一个虚拟主机下多个应用的反向代理时,是通过不同的uri路径来区分不同的应用的,即:需要在不同的location块上应用对应的反向代理配置。

代码语言:javascript
复制
http {
    upstream app1 {
        server 192.168.56.103:8080;
    }

    upstream app2 {
        server 192.168.56.104:8080;
    }

    # 在同一个虚拟主机下为多个应用配置反向代理
    server {
        listen 80;
        server_name localhost;

        location /app1 {
            proxy_pass http://app1/;
        }

        location /app2 {
            proxy_pass http://app2/;
        }
    }
}

作为多个虚拟主机的反向代理

nginx作为多个虚拟主机的反向代理
nginx作为多个虚拟主机的反向代理

当nginx作为多个虚拟主机的方向代理时,首先需要配置多个虚拟主机,再在每个虚拟主机下配置反向代理。

代码语言:javascript
复制
http {
    upstream app1 {
        server 192.168.56.103:8080;
    }

    upstream app2 {
        server 192.168.56.104:8080;
    }

    # 在虚拟主机1(监听80端口)下配置反向代理
    server {
        listen 80;
        server_name localhost;

        location / {
            proxy_pass http://app1/;
        }
    }

    # 在虚拟主机2(监听81端口)下配置反向代理
    server {
        listen 81;
        server_name localhost;

        location / {
            proxy_pass http://app2/;
        }
    }
}

负载均衡器

nginx作为负载均衡器
nginx作为负载均衡器

负载均衡并不是nginx的核心功能,只能算是一个副业,无法跟专业的负载均衡器相比(如:LVS,HAProxy)。 nginx只能支持特定几种协议的负载均衡,如:HTTP,HTTPS,FastCGI, uwsgi, SCGI, memcached和gRPC,同时也可以作为这几种协议的反向代理。 实际上,nginx作为负载均衡器的场景通常就是作为反向代理。 具体来讲,如果后端应用支持水平扩容,当进行集群部署时,使用nginx作为后端应用的反向代理,即:在upstream指令配置的服务器组中部署的是同一个应用。

简单轮训策略

如下是nginx作为负载均衡器的默认配置,采用简单轮训策略进行数据转发。

代码语言:javascript
复制
upstream app {
    server 192.168.56.103:8080;
    server 192.168.56.104:8080;
}

nginx除了支持简单的寻轮策略转发之外,还支持如下三种转发策略:最小连接数策略,客户端IP哈希策略,指定权重策略。

最小连接数策略

最小连接数策略是指nginx会优先将请求转发给负载较小的服务器,这样可以确保请求能尽快地得到响应,同时也尽可能地避免后端应用因为负载过大被压垮。 如下是“最小连接数策略”的配置模板:

代码语言:javascript
复制
upstream app {
    least_conn;
    server 192.168.56.103:8080;
    server 192.168.56.104:8080;
}

如上所示,通过指令“least_conn”配置最小连接数策略。

客户端IP哈希策略

客户端IP哈希是指将指定客户端的请求都转发到一个特定的服务器,这样可能会导致某些后端服务器的压力过大。 配置模板如下:

代码语言:javascript
复制
upstream app {
    ip_hash;
    server 192.168.56.103:8080;
    server 192.168.56.104:8080;
}

如上所示,通过指令“ip_hash”配置最小连接数策略。

服务器权重策略

在服务器权重策略下,大多数请求都会被转发到权重较大的后端服务器。 实际上,简单轮训策略是服务器权重策略的一个特例,即:所有后端服务器的权重都是相同的,所以将请求轮训转发到各个后端服务器。 如下为“服务器权重策略”的配置模板:

代码语言:javascript
复制
upstream app {
    server 192.168.56.103:8080 weight=3;
    server 192.168.56.104:8080;
}

在上述配置下,由于“192.168.56.103”的权重比“192.168.56.104”的权重大,假设总共有3次请求,那么有2次将会被转发到“192.168.56.103”。

显然,在权重策略下,是人为控制后端应用的负载。

邮件代理服务器

nginx作为邮件代理服务器
nginx作为邮件代理服务器

nginx支持对IMAP,POP3和SMTP协议的代理,关于配置nginx作为邮件代理服务器的具体参数详见:https://docs.nginx.com/nginx/admin-guide/mail-proxy/mail-proxy/

【参考】 https://nginx.org/en/docs/ nginx文档 https://nginx.org/en/docs/beginners_guide.html nginx新手入门 https://www.nginx.com/resources/admin-guide/ nginx管理手册 https://mp.weixin.qq.com/s/WWOlTIrYZZ5pvlALttFL8w Nginx 的反向代理及负载均衡 https://www.cnblogs.com/tugenhua0707/p/9880515.html nginx的反向代理proxy_pass指令 https://blog.51cto.com/wangwei007/1103734 Nginx配置proxy_pass转发的/路径问题

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • HTTP服务器
  • 反向代理服务器
    • 作为一个虚拟主机下多个应用的反向代理
      • 作为多个虚拟主机的反向代理
      • 负载均衡器
        • 简单轮训策略
          • 最小连接数策略
            • 客户端IP哈希策略
              • 服务器权重策略
              • 邮件代理服务器
              相关产品与服务
              负载均衡
              负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档