nginx 负载均衡配置

配置文件的位置:/usr/local/nginx/conf/nginx.conf

user
#user  www www;
nginx 运行的用户和用户组,默认为 nobody

pid
pid  logs/nginx.pid;

进程文件配置,默认为 logs/nginx.pid

error_log
error_log  logs/error.log  warn;
错误日志配置。

日志级别可选:debug < info < notice < warn < error < crit

日志级别越高,记录的日志信息越少

worker_processes
worker_processes  1;
nginx 对外提供 web 服务的 worder 进程数。通常设置和 cpu 核数的数量相等


worker_rlimit_nofile
worker_rlimit_nofile 1024;
一个 worker 进程能打开的文件的最大数目。

理论值应该是系统最多能打开的文件数(在 linux 中执行 ulimit -n 可得到值)与 worker 进程数相

除得到的值,但是 nginx 分配请求并不均匀,建议与 ulimit -n 的值保持一致

events
events {
     
    worker_connections  1024;
    use epoll;
}
worker_connections
worker_connections  1024;
设置单个 worker 进程最大连接数

use
use epoll;
设置复用客户端线程的轮询方法

use  [  kqueue  |  rtsig  |  epoll  |  select  |  poll  ]

epoll 是 linux 2.6 以上版本内核中的高性能网络 I / O 模型

如果不设置,nginx 会选择一个最适合你操作系统的模型

http
http {
     
}
http 服务器配置

include
include  mime.types;
设置 MIME 类型(资源的媒体类型),通过 http 协议由 web 服务器返回给客户端浏览器,浏览器会自动使用指定应用程序来打开资源文件

mime.types 文件位于 /usr/local/nginx/conf/mime.types

default_type
default_type  application/octet-stream;
默认的资源文件的媒体类型,application/octet-stream 为任意的二进制数据流传输

log_format
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

日志格式。"log_format  main"  这里的 main 是日志格式的名称,通过不同名称来定义多种日志格式


nginx 负载均衡配置_第1张图片

access_log
access_log  logs/access.log  main;
配置访问日志。可以指定使用的日志格式,如这里的 main

charset
charset  UTF-8;
使用的字符集编码

sendfile
sendfile  on;
通过调用 sendfile 函数(sendfile 是一个系统调用,在内核空间中完成),可以高效的发送静态文件

tcp_nopush
tcp_nopush  on;
一次性发送数据包。与 tcp_nodelay 配置项互斥,与 sendfile 配合工作

tcp_nodelay
#tcp_nodelay  on;0.2 秒后立即发送一个数据包,可以有效的防止网络阻塞,当需要及时发送数据时,应该开启它

keepalive_timeout
keepalive_timeout  60;
配置长连接的超时时间。服务器将在这个超时时间过后关闭链接

client_header_timeout
client_header_timeout  120;
等待客户端发送一个请求头的超时时间,超时 Nginx 返回一个请求超时的状态码(408,Request Timeout)

client_body_timeout
client_body_timeout  120;
等待客户端发送一个请求体的超时时间,超时 Nginx 返回一个请求超时的状态码(408,Request Timeout)

send_timeout
send_timeout 120;
客户端读取数据的超时时间,超时 Nginx 就会关闭该连接

client_header_buffer_size
client_header_buffer_size  16k;
缓存客户端请求头的大小

large_client_header_buffers
large_client_header_buffers  4 32k;
缓存客户端请求头的最大大小,此处为 432K 的大小

gzip
gzip  on;
采用 gzip 压缩的形式发送数据,可以减少发送的数据量

gzip_min_length
gzip_min_length  1k;
大于该值的内容才压缩,0 表示所有的内容都压缩

gzip_buffers
gzip_buffers  4 16k;
缓存 gzip 压缩数据的空间大小,此处为 416K 的大小

gzip_types
gzip_types  text/plain text/css application/x-javascript application/xml;
只有匹配配置的 MIME 类型的文档内容才会被压缩

nginx 默认会对 text/html 类型进行压缩,此处无需再配,若配置 text/html,nginx 会发出警告:

nginx: [ warn ] duplicate MIME type "text/html"

server_names_hash_bucket_size
server_names_hash_bucket_size 128;
服务器名称的 hash 表大小,如果太小,Nginx 无法启动

server
server {
     
}
虚拟主机配置

listen
listen  80;
监听端口

server_name
server_name  fanlychie.com www.fanlychie.com;
域名,可以配置多个,以空格分开

access_log
access_log  logs/fanlychie.access.log  main;
虚拟主机访问日志。

root
root  www.fanlychie.com;
网站根目录,用于存放网站静态资源文件。若为相对路径,则是相对于 nginx 安装的目录。如此处的物理路径为 /usr/local/nginx/www.fanlychie.com

location
location / {
     
}

nginx 负载均衡配置_第2张图片

多个 location 匹配 url 地址的优先级:

"=" 被匹配,停止搜索其他匹配

"^~" 被匹配,停止搜索其他匹配

"~""~*" 按配置文件中出现的先后顺序,一旦匹配,停止搜索其他匹配

若以上都没有匹配到,则交给 "/" 处理请求

expires
location ~ \.(js|css)$ {
     
    expires  1d;
}
js 和 css 文件由 nginx 直接提供,缓存一天

如客户端访问 http://www.fanlychie.com/styles/main.css

由于上面已经配置 root  www.fanlychie.com,nginx 会将

/usr/local/nginx/www.fanlychie.com/styles/main.css 文件直接返回给客户端

location ~ \.(gif|jpg|jpeg|png|ico)$ {
     
    expires  7d;
}
同上面,图片文件缓存 7 天

deny
location ~* \.jsp {
     
    deny  all;
}
禁止直接访问 *.jsp 文件(返回 403 状态码给客户端)

proxy_pass
location = / {
     
    proxy_set_header        Host             $host;
    proxy_set_header        X-Real-IP        $remote_addr;
    proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;
    proxy_pass  http://www.fanlychie.com/index;
}
proxy_pass 配置反向代理

即通过域名访问网站首页,nginx 将请求转发给真实的运用服务器处理,即

http://www.fanlychie.com/index (www.fanlychie.com 是上面配置的 server_name 的名称)

proxy_set_header

nginx 负载均衡配置_第3张图片

location / {
     
    proxy_pass  http://www.fanlychie.com;
    proxy_redirect          off;
    proxy_set_header        Host             $host;
    proxy_set_header        X-Real-IP        $remote_addr;
    proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;
    client_max_body_size    10m;
    client_body_buffer_size 128k;
    proxy_connect_timeout   90;
    proxy_send_timeout      90;
    proxy_read_timeout      90;
    proxy_buffers           32 4k;
}

proxy_redirect
proxy_redirect 与 proxy_pass 用法类似,proxy_pass 是转发请求,客户端 url 地址不变;

proxy_redirect 是请求重定向,客户端 url 地址发生变化。

client_max_body_size
允许客户端请求的最大单文件字节数

client_body_buffer_size
代理缓冲用户端请求的缓冲区最大字节数

proxy_connect_timeout
代理连接超时时间(nginx 跟后端服务器连接超时时间)

proxy_send_timeout
代理发送超时时间(后端服务器数据回传时间)

proxy_read_timeout
代理接收超时时间(连接成功后,后端服务器响应时间)

proxy_buffers
代理缓冲区的大小

error_page

location = /403.html {
     
    root  html;
}
location = /404.html {
     
    root  html;
}
location = /50x.html {
     
    root  html;
}
error_page  403              /403.html;
error_page  404              /404.html;
error_page  500 502 503 504  /50x.html;

错误页面配置。

upstream

upstream www.fanlychie.com {
     
    server 192.168.1.102:8080;
    server 192.168.1.103:8080;
}

负载均衡配置

upstream www.fanlychie.com,此处的 www.fanlychie.com 是上面 server 模块配置的

server_name。server 指定真实的运用服务主机地址,可以配置多个。

nginx 默认采用轮询的策略,将请求平均的分配到各个运用服务主机中,当其中一台服务主机宕机

后,会自动的被剔除,另外一台服务主机仍然能正常提供服务。

weight

upstream www.fanlychie.com {
     
    server 192.168.1.102:8080 weight=1;
    server 192.168.1.103:8080 weight=2;
};

在轮询的基础上加上权重,数值越大,表示权值越大,nginx 分发的请求越多

用于运用服务器性能不均的情况。当其中一台服务主机宕机后,会自动的被剔除,另外一台服务主

机仍然能正常提供服务

ip_hash

upstream www.fanlychie.com {
     
    ip_hash;
    
    server 192.168.1.102:8080;
    server 192.168.1.103:8080;
}

每个请求按访问 ip 的 hash 结果分配服务主机

当新的请求到达时,先将用户 ip 通过哈希算法求值,在随后的请求客户端 ip 的哈希值只要相同,

就会被分配至同一个后端服务器,这种调度可以解决 session 共享的问题,但有时会导致分配不均

即无法保证负载均衡

#user  nobody;
pid  logs/nginx.pid;
worker_processes  1;
worker_rlimit_nofile 1024;
error_log  logs/error.log  warn;
events {
     
    worker_connections  1024;
    use epoll;
}
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;
    charset UTF-8;
    sendfile       on;
    tcp_nopush     on;
    #tcp_nodelay   on;
    keepalive_timeout  60;
    client_header_timeout  120;
    client_body_timeout    120;
    send_timeout           120;
    client_header_buffer_size    16k;
    large_client_header_buffers  4 32k;
    gzip  on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_types       text/plain text/css application/x-javascript application/xml;
    server_names_hash_bucket_size 128;
    upstream www.fanlychie.com {
     
        server 192.168.1.102:8080;
        server 192.168.1.103:8080;
    }
    server {
     
        listen       80;
        server_name  fanlychie.com www.fanlychie.com;
        access_log   logs/fanlychie.access.log  main;
        root         www.fanlychie.com;
        location = / {
     
            proxy_set_header        Host            $host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass  http://www.fanlychie.com/index;
        }
        location ~ \.(js|css)$ {
     
            expires  1d;
        }
        location ~ \.(gif|jpg|jpeg|png|ico)$ {
     
            expires  7d;
        }
        location ~* \.jsp {
     
            deny  all;
        }
        location / {
     
             proxy_pass  http://www.fanlychie.com;
             proxy_redirect          off;
             proxy_set_header        Host            $host;
             proxy_set_header        X-Real-IP       $remote_addr;
             proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
             client_max_body_size    10m;
             client_body_buffer_size 128k;
             proxy_connect_timeout   90;
             proxy_send_timeout      90;
             proxy_read_timeout      90;
             proxy_buffers           32 4k;
        }
        location = /403.html {
     
            root  html;
        }
        location = /404.html {
     
            root  html;
        }
        location = /50x.html {
     
            root  html;
        }
        error_page  404              /404.html;
        error_page  403              /403.html;
        error_page  500 502 503 504  /50x.html;
    }
}

附全局变量表

变量 描述
$args 请求的参数
$content_length 请求头中的 Content-length 域的值
$content_type 请求头中的 Content-Type 域的值
$host 请求主机域的值,否则为服务器名称
$http_user_agent 客户端 agent 信息
$http_cookie 客户端 cookie 信息
$request_method 客户端请求的动作,通常为 GET 或 POST
$remote_addr 客户端的 IP 地址
$remote_port 客户端的端口
$remote_user 已经经过 Auth Basic Module 验证的用户名
$request_filename 当前请求的文件路径
$query_string 与 $args 同
$scheme HTTP 方法(如 http,https)
$server_protocol 请求使用的协议,通常是 HTTP/1.0 或 HTTP/1.1
$server_addr 服务器地址,在完成一次系统调用后可以确定这个值
$server_name 服务器名称
$server_port 请求到达服务器的端口号
$request_uri 包含请求参数的原始 URI,不包含主机名,如:"/foo/bar.php?arg=baz"
$uri 不带请求参数的当前 URI,$uri 不包含主机名,如 “/foo/bar.html”
$document_uri 与 $uri 同

附表达式列表

表达式 表达式 描述
-f !-f 判断文件是否存在
-d !-d 判断目录是否存在
-e !-e 判断文件或目录是否存在
-x !-x 判断文件是否可执行

你可能感兴趣的:(nginx,负载均衡,linux)