Nginx 快速入门 系列(一)

1,645 阅读4分钟

应用场景


  1. 静态资源服务: 通过本地文件系统提供服务
  2. 反向代理服务: Nginx 缓存,反向代理
  3. API 服务: openResty

五个优点


  1. 高并发,高性能
  2. 扩展性好,有 openResty 等丰富的生态圈
  3. 高可用性
  4. 热部署,可以在不停止 Nginx 服务的情况下,进行升级
  5. BSD 许可证

四个组成部分


  1. 二进制可执行文件,由各个模块源码编译出的一个文件
  2. Nginx.conf 配置文件,控制 Nginx 的行为
  3. access.log 访问日志,记录每一条 http 访问信息
  4. error.log 错误日志,对问题进行定位

版本选择


开源版:Nginx.org 商业版: Nginx.com
如果是开发 API 服务或者是 Web 防火墙,可以选择 openResty .

下载和目录介绍


# 下载 Nginx
wget http://nginx.org/download/nginx-1.16.1.tar.gz   
# 进行解压
tar -xzf nginx-1.16.1.tar.gz
# 查看编译相关的命令
./configure --help

# 进行编译,PATH 是你本地指定的安装目录
./configure --prefix=PATH

# 执行首次安装命令
make install

Nginx 指令块


  1. http
  2. server
  3. upstream
  4. location

Nginx 命令行


  1. 命令格式:nginx -s reload
  2. 帮助命令: -h
  3. 使用指定的配置文件:-c
  4. 指定配置指令:-g
  5. 指定运行目录:-p
  6. 发送信号:-s 指运行期间执行相关命令;重启nginx: nginx - s reload; 进行日志切割: nginx -s reopen
  7. 测试配置文件,是否有语法错误:-t -T
  8. 打印 Nginx 的版本信息,编译信息等: -v -V

配置静态文件


# 开启 gizp 压缩
gizp on;

location {
    root   /root/data/web/dist;
    index  index.html index.htm;
}

反向代理


反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。 通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。 一台机器作为代理机器,可以根据负载均衡算法,将请求转发给下游服务器。

反向代理服务器通常有两种模型:

  • 作内容服务器的替身:

在防火墙外部设置一个代理服务器作为内容服务器的替身。当外部客户机尝试访问服务时,会访问到代理服务器,再由其代理到防火墙内部的内容服务器上。这样实际内容位于内容服务器上,在防火墙内部受到安全保护。代理服务器位于防火墙外部,在客户机看来就像是内容服务器。

  • 作为内容服务器的负载均衡器

可以利用代理服务器的高速缓存特性,创建一个用于负载均衡的服务器池,使用多个代理服务器来平衡各 Web 服务器间的网络负载,这样当 Web 服务器接收大量的请求时,可以使用代理服务器分担 Web 服务器的负载,以此提高网络访问效率。

location {
    root   /root/data/web/dist;
    index  index.html index.htm;
    # 配置代理转发
    proxy_pass: 
}

nginx中有两个模块有 proxy_pass 指令:ngx_http_proxy_module 的 proxy_pass; ngx_stream_proxy_module 的 proxy_pass

ngx_stream_proxy_module 模块的 proxy_pass 指令只能在 server 段使用使用, 只需要提供域名或ip地址和端口。可以理解为端口转发,可以是 tcp 端口,也可以是 udp 端口。 ngx_http_proxy_module 模块的 proxy_pass 指令需要在 location 段,location中的 if 段,limit_except 段中使用,除了需要提供域名或ip地址和端口外,还需要提供协议,如"http"或"https",还有一个可选的 uri 可以配置。

  • ngx_stream_proxy_module 模块的 proxy_pass

server {
    listen 127.0.0.1:12345;
    proxy_pass 127.0.0.1:8080;
}
 
server {
    listen 12345;
    proxy_connect_timeout 1s;
    proxy_timeout 1m;
    proxy_pass example.com:12345;
}
 
server {
    listen 53 udp;
    proxy_responses 1;
    proxy_timeout 20s;
    proxy_pass dns.example.com:53;
}
 
server {
    listen [::1]:12345;
    proxy_pass unix:/tmp/stream.socket;
}
  • ngx_http_proxy_module 模块 的 proxy_pass

server {
    listen      80;
    server_name www.test.com;
 
    # 正常代理,不修改后端url的
    location /some/path/ {
        proxy_pass http://127.0.0.1;
    }
 
    # 修改后端url地址的代理(本例后端地址中,最后带了一个斜线)
    location /testb {
        proxy_pass http://www.other.com:8801/;
    }
 
    # 使用 if in location
    location /google {
        if ( $geoip_country_code ~ (RU|CN) ) {
            proxy_pass http://www.google.hk;
        }
    }
 
    location /yongfu/ {
        # 没有匹配 limit_except 的,代理到 unix:/tmp/backend.socket:/uri/
        proxy_pass http://unix:/tmp/backend.socket:/uri/;;
 
        # 匹配到请求方法为: PUT or DELETE, 代理到9080
        limit_except PUT DELETE {
            proxy_pass http://127.0.0.1:9080;
        }
    }
 
}

因为反向代理以后,内容服务器接收到的请求参数来自于反向代理服务器,通过 proxy_set_header 字段进行设置,可以拿到客户端的请求参数.

location / {
    proxy_set_header Host $host;
    proxy_ser_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

配置缓存服务器


我们可以将一些信息缓存到内存中

http {
    # 
    proxy_cache_path path;
    location / {
        # cache_name 就是内存的存储位置
        proxy_cache cache_naem;
    }
}

  • path 参数
# http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_path
缓存文件的路径 + 
[levels=levels]   设置缓存文件目录层次;levels=1:2 表示两级目录
[use_temp_path=on|off]   临时文件的目录
keys_zone=name:size  设置缓存名字和共享内存大小
[inactive=time]   在指定时间内没人访问则被删除
[max_size=size]   在指定时间内没人访问则被删除
[manager_files=number] 
[manager_sleep=time] 
[manager_threshold=time] 
[loader_files=number] 
[loader_sleep=time] 
[loader_threshold=time] 
[purger=on|off]
[purger_files=number] 
[purger_sleep=time] 
[purger_threshold=time];