nginx简单用法和介绍

Nginx(发音同engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名,其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

Nginx官网:http://nginx.org/  
https://www.nginx.com/

安装

  • 编译安装
    下载对应的安装包进行编译安装
    1
    2
    ./configure --user=www --group=www --prefix=/usr/local/nginx/ --with-http_stub_status_module --with-openssl=/usr/local/openssl
    make && make install
  • yum安装(以centos7为例)
    官方示例:https://www.nginx.com/resources/wiki/start/topics/tutorials/install/
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #新建repo文件
    vi /etc/yum.repos.d/nginx.repo

    #复制以下内容
    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=0
    enabled=1

    #保存退出后,生成源数据缓存
    yum makecache

    #之后就可以yum命令安装
    yum install nginx

    #yum命令更新
    yum update nginx

Nginx反向代理

  1. proxy_pass
    语法:proxy_pass URL;
    配置块:location、if
    此配置项将当前请求反向代理到URL参数指定的服务器上,URL可以是主机名或IP地址加端口的形式,例如:

    1
    proxy_pass http://localhost:8000/uri/;

    也可以是UNIX句柄:

    1
    proxy_pass http://unix:/path/to/backend.socket:/uri/;

    还可以如上节负载均衡中所示,直接使用upstream块,例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    upstream backend {

    }

    server {
    location / {
    proxy_pass http://backend;
    }
    }

    用户可以把HTTP转换成更安全的HTTPS,例如:

    1
    proxy_pass https://192.168.0.1;

    默认情况下反向代理是不会转发请求中的Host头部的。如果需要转发,那么必须加上配置:

    1
    proxy_set_header Host $host;
  2. proxy_method
    语法:proxy_method method;
    配置块:http、server、location
    此配置项表示转发时的协议方法名。例如设置为

    1
    proxy_method POST;

    那么客户端发来的GET请求在转发时方法名也会改为POST。

  3. proxy_hide_header
    语法:proxy_hide_header the_header;
    配置块:http、server、location
    Nginx会将上游服务器的响应转发给客户端,但默认不会转发以下HTTP头部字段:Date、Server、X-Pad和X-Accel-*。使用proxy_hide_header后可以任意地指定哪些HTTP头部字段不能被转发。例如:

    1
    2
    proxy_hide_header Cache-Control;
    proxy_hide_header MicrosoftOfficeWebServer;
  4. proxy_pass_header
    语法:proxy_pass_header the_header;
    配置块:http、server、location与proxy_hide_header功能相反,proxy_pass_header会将原来禁止转发的header设置为允许转发。例如:

    1
    proxy_pass_header X-Accel-Redirect;
  5. proxy_pass_request_body
    语法:proxy_pass_request_body on | off;
    默认:proxy_pass_request_body on;
    配置块:http、server、location
    作用为确定是否向上游服务器发送HTTP包体部分。

  6. proxy_pass_request_headers
    语法:proxy_pass_request_headers on | off;
    默认:proxy_pass_request_headers on;
    配置块:http、server、location
    作用为确定是否转发HTTP头部。

  7. proxy_redirect
    语法:proxy_redirect [ default|off|redirect replacement ];
    默认:proxy_redirect default;
    配置块:http、server、location
    当上游服务器返回的响应是重定向或刷新请求(如HTTP响应码是301或者302)时,proxy_redirect可以重设HTTP头部的location或refresh字段。
    例如,如果上游服务器发出的响应是302重定向请求,location字段的URL是:http://localhost:8000/two/some/uri/,
    那么在下面的配置情况下,实际转发给客户端的location是http://frontend/one/some/uri/。

    1
    proxy_redirect http://localhost:8000/two/ http://frontend/one/;

    这里还可以使用ngx-http-core-module提供的变量来设置新的location字段。例如

    1
    proxy_redirect   http://localhost:8000/ http://$host:$server_port/;

    也可以省略replacement参数中的主机名部分,这时会用虚拟主机名称来填充。例如:

    1
    proxy_redirect http://localhost:8000/two/ /one/;

    使用off参数时,将使location或者refresh字段维持不变。例如:

    1
    proxy_redirect off;

    使用默认的default参数时,会按照proxy_pass配置项和所属的location配置项重组发往客户端的location头部。例如,下面两种配置效果是一样的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    location /one/ {  
    proxy_pass http://upstream:port/two/;
    proxy_redirect default;
    }

    location /one/ {
    proxy_pass http://upstream:port/two/;
    proxy_redirect http://upstream:port/two/ /one/;
    }
  8. proxy_next_upstream
    语法:proxy_next_upstream [error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_404 | off ];
    默认:proxy_next_upstream error timeout;
    配置块:http、server、location
    此配置项表示当向一台上游服务器转发请求出现错误时,继续换一台上游服务器处理这个请求。前面已经说过,上游服务器一旦开始发送应答,Nginx反向代理服务器会立刻把应答包转发给客户端。因此,一旦Nginx开始向客户端发送响应包,之后的过程中若出现错误也是不允许换下一台上游服务器继续处理的。这很好理解,这样才可以更好地保证客户端只收到来自一个上游服务器的应答。proxy_next_upstream的参数用来说明在哪些情况下会继续选择下一台上游服务器转发请求。
    error:当向上游服务器发起连接、发送请求、读取响应时出错。
    timeout:发送请求或读取响应时发生超时。
    invalid_header:上游服务器发送的响应是不合法的。
    http_500:上游服务器返回的HTTP响应码是500。
    http_502:上游服务器返回的HTTP响应码是502。
    http_503:上游服务器返回的HTTP响应码是503。
    http_504:上游服务器返回的HTTP响应码是504。
    http_404:上游服务器返回的HTTP响应码是404。
    off:关闭proxy_next_upstream功能—出错就选择另一台上游服务器再次转发。

  9. 简单示例(以centos7为例)

  • 反向代理网站
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #新增配置文件
    vi /etc/nginx/conf.d/fxdl.conf
    #复制以下内容
    server{
    listen 80;
    server_name gl.yunzaifei.com;
    location / {
    proxy_pass https://www.google.com;
    }
    }
    #保存退出后重启nginx
    nginx -s reload
  • 反向代理北地端口
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #新增配置文件
    vi /etc/nginx/conf.d/fxdl.conf
    #复制以下内容
    server {
    listen 80;
    server_name api.xxx.com;

    location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://127.0.0.1:8000/;
    proxy_redirect off;
    }
    }

    #保存退出后重启nginx
    nginx -s reload
    Nginx的反向代理模块还提供了很多种配置,如设置连接的超时时间、临时文件如何存储,以及最重要的如何缓存上游服务器响应等功能。这些配置可以通过阅读ngx_http_proxy_module模块的说明了解,只有深入地理解,才能实现一个高性能的反向代理服务器。