Nginx 笔记

Wu Jun 2019-12-25 15:59:03
Categories: > Tags:

一、nginx架构

1. 进程模型

Nginx 分一个 master 进程和多个 worker 进程。

2. 异步非阻塞

master进程根据配置建立好socket,再fork出多个worker进程。worker进程竞争请求,每个worker只有一个主线程,有一个函数,执行无限循环,不断处理收到的来自客户端的请求。异步非阻塞,同时处理的请求只有一个,只是在请求间不断地切换而已。

3. 流畅修改

重启或修改nginx配置,服务不会中断。
  master进程接到信号,先重新加载配置文件,再启动新worker进程,并向所有老worker进程发送信号。老worker收到信号后,不再接收新的请求,处理完当前进程中请求后退出。

4. 模型优点

二、Nginx 安装

  1. 安装Nginx
#1、下载 Nginx
wget http://nginx.org/download/nginx-1.6.2.tar.gz
#2、解压安装包
tar zxvf nginx-1.6.2.tar.gz
#3、进入安装包目录
cd nginx-1.6.2
#4、编译安装
./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35
make
make install
#5、查看nginx版本
/usr/local/webserver/nginx/sbin/nginx -v
  1. 配置Nginx
/usr/sbin/groupadd user
/usr/sbin/useradd -g user user
  1. 控制Nginx
    • 启动nginx:运行可执行文件 -s 参数控制Nginx :
    • stop:快速关闭服务
    • quit:正常关闭服务
    • reload: 重新加载配置文件
    • reopen: 重启 Nginx

三、配置文件结构

nginx的配置系统由一个主配置文件nginx.conf和其他一些辅助的配置文件构成。 # 号表示注释。

####指令组成 指令由指令名称及其参数组成。

user nobody;
server {
  # configuration of HTTP virtual server 2
}

####include指令 为了使配置更易于维护,可将复杂或可服用指令拆分存储在其他.conf,并在主nginx.conf文件中使用include指令引用引进来。

include conf.d/http;

####指令上下文 如果块指令在大括号内部有其他指令,则称为上下文

指令上下文之间可能互相包含。

示例配置

user  nobody;
worker_processes  1;
error_log  logs/error.log  info;

events {
    worker_connections  1024;
}

http {
    server {
        listen          80;
        server_name     [www.linuxidc.com](http://www.linuxidc.com/);
        access_log      logs/linuxidc.access.log main;
        location / {
            index index.html;
            root  /var/www/[linuxidc.com/htdocs](http://linuxidc.com/htdocs);
        }
    }

    server {
        listen          80;
        server_name     [www.Androidj.com](http://www.androidj.com/);
        access_log      logs/androidj.access.log main;
        location / {
            index index.html;
            root  /var/www/[androidj.com/htdocs](http://androidj.com/htdocs);
        }
    }
}

mail {
    auth_http  127.0.0.1:80/auth.php;
    pop3_capabilities  "TOP"  "USER";
    imap_capabilities  "IMAP4rev1"  "UIDPLUS";
    server {
        listen     110;
        protocol   pop3;
        proxy      on;
    }

    server {
        listen      25;
        protocol    smtp;
        proxy       on;
        smtp_auth   login plain;
        xclient     off;
    }
}

四、nginx 模块

nginx是由core和一系列的功能模块所组成。 nginx core实现了底层的通讯协议,为其他模块和nginx进程构建了基本的运行时环境,并且构建了其他各模块的协作基础。

五、nginx 应用

  1. 代理服务器(反向、正向)
  2. HTTP 服务器(包含动静分离)
  3. 负载均衡

代理服务器

反向代理

1. 传递请求

当NGINX代理请求时,它将请求发送到指定的代理服务器,获取响应,并将其发送回客户端。 **_ pass指令:地址可指定为域名或IP地址(可包括端口)。也可以指向一组命名的服务器。如果URI与地址一起指定,将替换匹配请求的URI。

location /some/path/ {
    proxy_pass http://www.example.com/link/;
}
location ~ \.php {
    proxy_pass http://127.0.0.1:8000;
}
2. 传递请求标头

proxy_set_header:修改、设置 header 字段,可以在一个或多个 location、server、http 块中指定。

location /some/path/ {
    proxy_set_header Host $host;
}
3. 配置缓冲区

默认情况下,NGINX 缓存来自代理服务器的响应,直到收到整个响应。 proxy_buffering:启用和禁用缓冲 proxy_buffers :请求缓冲区的大小和数量 proxy_buffer_size :响应缓冲区的大小

location /some/path/ {
    proxy_buffers 16 4k;
    proxy_buffer_size 2k;
    proxy_pass http://localhost:8000;
}
4. 选择传出IP地址

代理服务器配置为只接受特定 IP 的连接时。 proxy_bind:指定 IP

location /app1/ {
    proxy_bind 127.0.0.1;
    proxy_pass http://example.com/app1/;
}

正向代理

客户端向代理发送一个请求并指定目标,然后代理向原始服务器转交请求并将获得的内容返回给客户端。目前不支持HTTPS。

    resolver 114.114.114.114 8.8.8.8;
    server {
        resolver_timeout 5s;
        listen 81;
        access_log  e:/wwwrootproxy.access.log;
        error_log   e:/wwwrootproxy.error.log;
        location / {
            proxy_pass http://$host$request_uri;
        }
    }

HTTP服务器

Web服务器
1. 日志
2. server
3. 资源定位
4. 返回特定状态码
5. 重写URI
6. 重写HTTP响应
7. 压缩和解压
map $status $loggable {
  ~^[23] 0;
  default 1;
}
access_log /access.log combined if=$loggable;
error_log /error.log;

http {
    server {
        listen       80;      
        server_name  localhost;
        client_max_body_size 1024M; 
        gzip on;

        location / {  
            root /data/www;
            index  index.html;
            try_files $uri https://cdn.jsdelivr.net/gh/wujun234/images@master/default.gif;
            try_files $uri $uri/ $uri.html =404;
            try_files $uri $uri/ @backend;
        }

        location /users/ {
            rewrite ^/users/(.*)$ /show?user=$1 break;
        }

        location @backend {
            proxy_pass http://backend.example.com;
        }

        location /wrong/url {
            return 404;
        }

        location / {
            gunzip on;
            sub_filter 'href="http://127.0.0.1:8080/' 'href="https://$host/';
            sub_filter /blog/ /blog-staging/;
            sub_filter_once on;
        }

        error_page 404 /404.html;
    }
}

如果访问http://localhost就会默认访问到/data/www目录下面的index.html。

动静分离

根据请求URI拆分动静资源,分开导流向不同的代理或提供不同的文件

负载均衡

根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。

Nginx 目前支持自带 3 种负载均衡策略,还有 2 种常用的第三方策略。

1. RR(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream test {
    server localhost:8080;
    server localhost:8081;
}

server {
    location / {
        proxy_pass http://test;
        proxy_set_header Host $host:$server_port;
    }
}
2. 权重

指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。

upstream test {
    server localhost:8080 weight=9;
    server localhost:8081 weight=1;
}
3. ip_hash

ip_hash 的每个请求按访问 ip 的 hash 结果分配,每个访客固定访问一个服务器,可解决程序状态问题。

upstream test {
    ip_hash;
    server localhost:8080;
    server localhost:8081;
}
4. fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream backend {
    fair;
    server localhost:8080;
    server localhost:8081;
}
5. url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

upstream backend {
    hash $request_uri;
    hash_method crc32;
    server localhost:8080;
    server localhost:8081;
}