从一个初学者的角度窥探Nginx

标准Nginx配置模板


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}

Nginx配置文件详解

完整的Nginx配置文件是由六大部分组成:

  • main:全局设置
  • events:项工作模式设置
  • http:http设置
  • upstream:负载均衡设置
  • server:主机设置
  • location:URL设置
main
events {
    ...
}
http {
    ...
    upstream project_name {
    	...
	}
	server {
        ...
        location {
        	...
    	}
		include /path/of/nginx/conf.d/*.conf;
    }
}

main 模块

全局设置填写 Nginx 的全局配置,在此区域填写的内容会员应用到 Nginx 的全局。

常用的全局配置:

  • worker_processes :Nginx 开启的子进程数
  • error_log :定义全局错误日志文件,可选值有:debug、info、notice、warn、error、crit
  • pid :指定进程 id 的存储文件位置
  • worker_rlimit_nofile :指定 Nginx 进程最多可以打开的文件描述符数目

示例如下:

# 定义 Nginx 运行的用户和用户组
user nobody root;

# Nginx 进程数(建议为 CPU 总核数,或者设置为 auto)
worker_precesses 8;

# 定义全局错误日志类型
error_log /var/log/nginx/error.log info;

#进程文件
pid	/var/run/nginx.pid;

# 一个 Nginx 进程最多可以打开的文件描述数目(建议与 ulimit -n 的值保持一致)
worker_rlimit_nofile 65535;

注:一般而言,此处的全局配置都可以保留默认设置(即什么都不用写)。

events 模块

用来指定 Nginx 的工作模式和单个进程的连接数上限。示例如下:

events {
    # 参考事件模型,可选值有:kqueue、rtsing、epoll、/dev/poll、select、poll
    # epoll 模型是 Linux 2.6 以上版本内核中高性能网络 I/O 模型
    # FreeBSD 或者 macOS ,可使用 kqueue 模型
    use	epoll;
    
    #单个进程最大连接数(默认是 1024 ,最大连接数 = 连接数 x 进程数)
    worker_connections	65535;
}

注:上述进程的最大连接数受 Linux 系统进程的最大打开文件数的限制,只有在执行操作系统命令 [# ulimit -n 65536]后 worker_connections 的设置才能生效。

http 模块

http 部分是配置文件的最核心部分,它包括了绝大部分 HTTP 服务器相关属性的配置:

  • 是否适用 Keepalive
  • 是否适用 gzip 进行压缩
  • server 子模块
  • upstream 子模块

示例如下:

http {
    # 文件扩展名和文件类型映射表
    include	mime.types;
    
    # 默认文件类型
    default_type application/octet-stream;
    
    # 默认编码
    charset	utf-8;
    
    # 服务器名字的 hash 表大小
    server_name_hash_bucket_size 128;
    
    # 缓冲区代理缓冲用户端请求的最大字节数
    client_body_buffer_size 128k;
    
    # 允许客户端请求的最大单文件字节数
    client_max_body_size 10m;
    
    # 开启高效文件传输模式,启用之后 Nginx 会调用 sendfile 函数来输出文件
    # I/O 负载较大的应用,建议设置为 off,以平衡磁盘与网络 I/O 处理速度,减少系统负载
    sendfile on;
    
    # 开启目录列表访问(默认关闭)
    autoindex on;
    
    # 防止网络阻塞
    tcp_nopush on;
    tcp_nodelay on;
    
    # 长连接超时时间,单位为秒
    keepalive_timeout 120;
    
    # gzip 模块设置
    # 开启 gizp 压缩输出
    gzip on
    # 最小压缩文件的大小
    gizp_min_length 1k;
    # 压缩缓冲区
    gzip_buffers 4 16k;
    # 压缩版本
    gzip_http_version 1.1;
    # 压缩等级
    gzip_comp_level 2;
    # 压缩类型,默认类型已经包含 text/html,所以下面就用再写了
    gzip_types text/plain application/x-javacript text/css application/xml;
    # 会在响应头加个 Vary:Accept-Encodeing,可以让前端的缓存服务器缓存经过 gzip 压缩的页面
    gizp_vary on;
    # 在开启限制 IP 连接数的时候需要使用
    limit_zone crawler $binary_remote_addr 10m;
    
    upstream project_name {
        ...
    }
    server {
        ...
    }
}

server 模块

server 模块是 http 的子模块,它可以定义一个虚拟主机,server {} 表示虚拟主机的配置范围。示例如下:

server {
    # 用于指定虚拟主机的服务端口
    listen 8081;
    
    # 用于指定 IP 地址或者域名,多个域名直接用 空格分开
    server_name localhost www.nginx.com;
    
    # 表示在 server 这个虚拟主机内 Web 服务的跟目录
    root /nginx/www/path/;
    
    # 定义默认的首页地址
    index index.html index.htm;
    
    # 设置网页的默认编码格式
    charset utf-8;
    
    # 指定虚拟主机访问日志的存放路径,后面接上日志的输出格式
    access_log usr/local/var/log/host.access.log main;
    access_log usr/local/var/log/host.error.log error;
    
    location {
        ...
    }
}

location 模块

location 模块是 Nginx 中可自定义程度最高的模块,location 如同它的名字一样是用来定位解析 URL 的,通过正则匹配,用户可以通过 location 指令实现对网页的各种处理。示例如下:

location / {
    root /nginx/www/path;
    index index.html index.htm;
}

具体可查看:Nginx简单配置与使用

upstream模块

upstream模块又称为负载均衡模块。示例如下:

upstream example.com {
    fair;
    server 172.17.1.1:80;
    server 172.17.1.2:8080 down;
    server 172.17.1.3:9999 max_fails=3 fail_timeout=20s max_conns=1000;
    server 172.17.1.4:2333 backup;
}

example.com 表示通过 upstream 指令定义了一个负载均衡的名称 。(名称可以任意指定,不一定是一个域名)

fair是一种负载均衡调度算法。

down 表示该 server 不参与负载均衡。

backup 表示预留的备份机器,只有当其他所有非 backup 机器出现故障或异常忙碌是,才会请求 backup 机器,所以这台机器的负载压力很小。

max_fails 表示允许请求失败的次数(默认为1次),当超过最大次数时返回 proxy_next_upstream 模块定义的错误。

fail_timeout 表示在经历 max_fails 次失败后暂停服务的时间。

max_conns 表示限制分配个后端服务器处理的最大连接数量,超过这个数量,将不会分配新的连接给它。

官网配置说明文档: https://nginx.org/en/docs/http/ngx_http_core_module.html

Nginx 负载均衡

目前 Nginx 负载均衡模块共有4中调度算法。

权重轮询

weight轮询 每一个请求按照请求的时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,Nginx 轮询列表将自动去除该服务器,使用户访问不受影响。

weight 用于指定轮询权值,weight 值越大,分配到访问的概率越高,主要用于后端服务器性能不均的情况。

weight 轮询是 Nginx 的默认调度算法

示例配置如下:

upstream upstream.example.com {
    server 172.17.1.1:80 weight=1;
    server 172.17.1.2:8080 weight=1;
    server 172.17.1.3:9999 weight=10;
    server 172.17.1.4:2333 backup;
}

server {
    listen 80;
    server_name example.com;
    access_log /usr/local/var/log/nginx/access.log main;
    access_log /usr/local/var/log/nginx/error.log error;
    location / {
     	proxy_pass http://upstream.exaple.com;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

此负载均衡配置的作用:(重启 Nginx:nginx -s reload)每次刷新页面,页面的请求会分别发送到前三台服务器,第四台是备份服务器,其中 第三台处理的请求最多,因为它的权重最大。

IP 哈希

ip_hash 根据 hash 算法对每一个请求中的访问 IP 进行处理。使来自同一个 IP 的访客固定访问一个后端服务器。

这种方式可以简单而有效的解决动态网页存在的会话(session)共享问题。

示例配置如下:

upstream upstream.example.com {
    ip_hash;
    server 172.17.1.1:80;
    server 172.17.1.2:8080;
    server 172.17.1.3:9999;
    server 172.17.1.4:2333;
}
  • 当负载均衡调度算法为 ip_hash 时,后端服务器的状态不能有 weight。因为这将导致流量分配不均匀。
  • 当负载均衡调度算法为 ip_hash 时,后端服务器的状态不能有 backup。因为访问已经固定,备份已经没有意义,同时会报错。

Fair 调度

fair 比前面两种更智能。这个算法可以根据页面的大小和加载时间的长短智能地进行负载均衡。

简单来说,就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。

Nginx 默认是不支持 fair 的,用户需要手动编译安装 Nginx 的 upstream_fair模块。下载地址: https://github.com/gnosek/nginx-upstream-fair

[root@VM_0_6_centos local]# wget https://github.com/gnosek/nginx-upstream-fair/archive/master.zip
[root@VM_0_6_centos local]# unzip master.zip

进入到 Nginx 的安装目录下,下载 fair 模块源码,解压后的目录名为:nginx-upstream-fair-master

重新编译 Nginx,将 fair 模块添加到编译参数。进入到 Nginx 源码目录下

URL 哈希

url_hash 根据 hash 算法对每个请求中的访问 url 进行处理,使来自同一个 url 的请求固定定向到同一个后端服务器,这样可以提高后端缓存服务器的效率。

示例配置如下:

upstream upstream.example.com {
    hash $request_uri;
    server 172.17.1.1:80;
    server 172.17.1.2:8080;
    server 172.17.1.3:9999;
    server 172.17.1.4:2333;
}

==未完待续==

posted @ 2020-06-05 11:40  稻草堆上打着滚儿  阅读(115)  评论(0编辑  收藏  举报