部署运维

一篇就弄懂Nginx的常规用法

2019-07-02  本文已影响15人  VienFu

本文旨在讲述nginx的常见概念及用法。

1. 概念

Nginx(engine-x)是一个高性能的Web服务器和HTTP反向代理服务器,当然它还可以用作负载均衡、HTTP缓存和邮件服务器等。

Nginx作为Web服务器,跟Apache相比,它占用的资源更小,能够支持更多的并发连接(官方文档宣称可达到50000个),效率更高。

2. 正向代理和反向代理的区别

首先,正向代理和反向代理本质的区别是其代理的对象不同,正向代理代理的是客户端,代替客户端去访问服务器;而反向代理则是代理的服务端,代替服务器去接受客户端的请求,下面以买房为例简单说明一下:

正向代理

假设A现在要买一个二手房,并且知道C手里有满足自己需求的房源,但是却不认识C;而B同时认识A和C,这样A就可以通过B来购买C的房子。整个过程中A对于C来讲是无感的但是A却清楚明白自己是从C那儿获取的房源。

反向代理

同样A要买一个二手房但是不知道具体的房源,而B呢手里有很多房源恰好有满足自己需求的,这样A通过B就可以买到自己心仪的房子了。整个过程中A是不知道自己所买的房子真正的户主是谁,B在中间就充当一个类似现在很多房屋中介的角色。

下面讲讲几种场景下nginx的配置,通常http模块一般用作nginx全局配置,通过include来导入各个server的配置,http模块在此处就不展开了,主要围绕server模块来进行。

3. 反向代理

nginx是通过关键字proxy_pass来实现的,下面是一个实例:

server {
        listen 80;
        server_name  www.example.com;

        location / {
            proxy_pass  192.168.0.12:8090;
        }
}

4. 负载均衡

nginx的负载均衡是关键字upstream配合proxy_pass来实现的,下面是简单的例子:

http {
  upstream django_project {
      server www.xxx.com:8001;
      server www.yyy.com:8001;
      server www.zzz.com:8001;
  }
  server {
    listen 80;
    server_name: www.example.com;

    location / {
      proxy_pass django_project;
    }
  }
}

另外负载均衡可以有很多策略,默认采用轮询的方式,还支持权重、ip哈希、url哈希等,此处不一一说明了。

5. Nginx其它配置说明

nginx缓存

nginx缓存就是将请求过的内容在本地建一个副本,下次请求时直接响应而不必去访问后端,那如何启用nginx的缓存功能呢?

启用nginx缓存,需要先在http全局区域设置proxy_cache_path,然后在server区域通过proxy_cache使用它,当然还有一些其他的设置参数,下面通过具体的实例来说明:

http {
  ...
  # 设置缓存的目录、名称及占用内存大小
  # 设置每次加载时最大加载时间及文件的数量
  # 设置缓存占用最大内存总量
  proxy_cache_path /var/www/nginx_cache keys_zone=mytest:10m loader_threshold=300 load_files=200 max_size=200m;
  server {
    listen 80;
    server_name www.example.com;
    # 使用缓存mytest
    proxy_cache mytest;
    location / {
      proxy_pass www.example01.com:8090;
      # 设置缓存的有效期
      proxy_cache_valid any 5m;
      # 设置最少几次请求进行缓存
      proxy_cache_min_uses 5;
      # 设置当如下参数不为空时跳过缓存
      proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
    }
  }
}

另外还可以通过proxy_cache_methods来指定哪些方法被缓存。

nginx跳转/重定向

此功能是通过nginx的rewrite模块来实现的,使用正则表达式改变URI,并且根据变量来转向以及选择配置。

常见格式:
rewrite uri_regex replacement [flag]

rewrite的几种flag:

下面举一个简单的例子:

server {
  listen 80;
  server_name: localhost;

  location /mytest {
    rewrite ^/mytest /mytest00;
    rewrite ^/mytest00 /more/index.html break;
    # rewrite ^/mytest00 /more/index.html last;
    rewrite ^/more/index\.html /mytest02;  # 不会被执行
    proxy_pass https://www.baidu.com;
  }

  # location /more/index.html {
  #  proxy_pass https://www.baidu.com;
  # }
}

在浏览器上输入:localhost:80/mytest,结果输出百度产品大全页面;
如果把break行注释掉,而last行去掉注释,则会页面输出error;
而进一步把其下location区域注释去掉,则页面输出百度产品大全页面。

rewrite模块还支持if指令,另外rewrite 指令是使用指定的正则表达式regex来匹配请求的urI,如果匹配成功,则使用replacement更改URI。rewrite指令按照它们在配置文件中出现的顺序执行。可以使用flag标志来终止指令的进一步处理。如果替换字符串replacement以http://,https://或$ scheme开头,则停止处理后续内容,并直接重定向返回给客户端。

跨域

服务器默认是不允许跨域的,为了解决跨域的问题,我们可以在nginx做如下配置:

location / {
  add_header Access-Control-Allow-Origin *;
  add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
  add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'

  if ($request_method = 'OPTIONS') {
    return 204;
  }
}
上一篇 下一篇

猜你喜欢

热点阅读