- 正向代理代理客户端(客户端开启VPN访问外网;用户有感知,需要客户端主动开启VPN)
- 反向代理代理服务器端(客户端将请求发送给代理,由代理去决定交给哪台服务器处理,到底是哪台服务器处理的请求用户无感知;)
Nginx的负载均衡有两种策略:
- 内置策略
- 扩展策略
- 轮询:假设有三台服务器,通过Nginx将请求平均的分发到三台服务上;
- 加权轮询:通过添加权重,可以给服务器性能比较好的设置较大的权重,将更多的请求转发给这台服务器;
- Ip Hash:对客户端请求的Ip 进行Hash操作,然后根据Hash结果将同一个客户端Ip 的请求分发给同一服务器;可以解决Session不共享的问题;(不建议采用Nginx解决Session共享问题,推荐使用Redis);
静态文件:不需要后台处理的文件称之为静态文件;
4. Nginx的目录结构 4.1 confnginx.conf Nginx 的主配置文件;
4.2 html存放默认的网页和一些静态资源;
4.3 logs日志记录的文件夹;
- access.log:访问日志
- error.log:错误日志
存放Nginx的主程序;
5. Nginx.conf 的基本配置# ....
# 全局配置:配置影响nginx全局的指令。
# events配置:配置影响nginx服务器或与用户的网络连接。
events {
worker_connections 1024;
}
# http配置:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。
http {
// http 配置
upstream xx{
// 负载均衡配置
}
# server配置:配置虚拟主机的相关参数,一个http中可以有多个server。
server {
listen 80;
server_name localhost;
# 代理location配置:配置请求的路由,以及各种页面的处理情况。
location [PATTERN] {
}
}
}
5.1 nginx 的最小配置
# 启动的工作进程个数;nginx 的工作模型是由 1 个master进程和 n 个 work进程运行的;(n>=1)
worker_processes 1;
# 启动10个工作进程
# worker_processes 10;
# 事件驱动模块
events {
# 每个work进程可以创建的连接数;(每个work可以创建1024个连接)worker_processes number | auto;
worker_connections 1024;
}
http {
#include命令:引入其他的配置文件;(引入mime.types配置文件)
include mime.types;
#如果mime类型没匹配上,默认使用二进制流的方式传输
default_type application/octet-stream;
#数据0拷贝; 使用linux的sendfile(socket,file,len)高效网络传输;
# on:例如当客户端向nginx发送请求一个视频文件,当on开启时,nginx不会将这个文件加载进内存之后,然后在内存中再返回给客户端。而是让客户端直接去操作系统中文件的位置,直接去read/write 文件;
sendfile on;
# 保持连接,超时的时间;
keepalive_timeout 65;
# server:代表一个虚拟主机
server {
# listen:当前监听的服务器的端口号;
listen 80;
# 当前这台主机的主机名称;
server_name localhost;
# 什么是url,什么是uri?
# `https://www.baidu.com/test/tieba.html/` ===> url
# 域名:`https://www.baidu.com/`
# `/test/tieba.html/` ===> uri
# location:匹配 uri
location /{
# root:匹配到location 之后,从哪个(html)目录下去找资源文件;
# html:指的是相对路径(/usr/local/nginx)(nginx的主目录);
root html;
# 匹配location之后,后缀是index的话,默认去找index.html或者index.htm文件;
index index.html index.htm;
}
# 错误页面,当服务器发生 500 502 503 504 等错误码时,找 域名 + /50x.html 页面;
# `https://www.baidu.com/50x.html`
error_page 500 502 503 504 /50x.html;
# 匹配上面的 /50x ;
location /50x.html{
# 找到相对路径下的 html 文件夹下的 /50x.html 页面;
root html;
}
}
}
5.2 nginx详细配置
# 启动的工作进程个数;nginx 的工作模型是由 1 个master进程和 n 个 work进程运行的;(n>=1)
worker_processes 1;
# 启动10个工作进程
# worker_processes 10;
#定义Nginx运行的用户和用户组 user [user] [group]
user www www;
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit | alert | emerg]
# error_log [path] [debug | info | notice | warn | error | crit | alert | emerg]
# 这个设置可以放入全局块,http块,server块
error_log /var/log/nginx/error.log info;
# 事件驱动模块
events {
# worker_processes number | auto;
# 每个work进程可以创建的最大连接数;(每个work可以创建1024个连接)
worker_connections 1024;
#设置网路连接序列化,防止惊群现象发生(防止多个进程对连接的争抢),默认为on
# 惊群现象:Nginx服务器为多进程的; 当某一时刻只有一个网络连接到来时,多个睡眠进程会被同时叫醒,但只有一个进程可获得连接。如果每次唤醒的进程数目太多,会影响一部分系统性能。
accept_mutex on;
#设置一个进程是否同时接受多个网络连接,默认为off;
# off:nginx一个工作进程只能同时接受一个新的连接
# on:一个工作进程可以同时接受所有的新连接。
# 如果nginx使用kqueue连接方法,那么这条指令会被忽略,因为这个方法会报告在等待被接受的新连接的数量。
multi_accept on;
# 指定使用哪种网络IO模型 user select|poll|kqueue|epoll|resig|/dev/poll|eventport
#use select;
#use epoll;
#客户端请求头部的缓冲区大小。
#client_header_buffer_size 4k;
}
http {
#include命令:引入其他的配置文件;(引入mime.types配置文件)
include mime.types;
#如果mime类型没匹配上,默认使用二进制流的方式传输
default_type application/octet-stream;
#数据0拷贝; 使用linux的sendfile(socket,file,len)高效网络传输;
# on:例如当客户端向nginx发送请求一个视频文件,当on开启时,nginx不会将这个文件加载进内存之后,然后在内存中再返回给客户端。而是让客户端直接去操作系统中文件的位置,直接去read/write 文件;
# 可以在http块、server块或者location块中进行配置
sendfile on;
# 设置sendfile最大数据量,此指令可以在http块、server块或location块中配置
# sendfile_max_chunk size;
# 其中,size值如果大于0,Nginx进程的每个worker process每次调用sendfile()传输的数据量最大不能超过这个值(这里是128k,所以每次不能超过128k);如果设置为0,则无限制。默认值为0。
# sendfile_max_chunk 128k;
# 保持连接,超时的时间;
# 此指令可以在http块、server块或location块中配置。
# keepalive_timeout timeout [header_timeout]:
# header_timeout,可选项,在应答报文头部的Keep-Alive域设置超时时间:“Keep-Alive:timeout= header_timeout”
keepalive_timeout 65; # 超时时间 65s;
# 在服务器端保持连接的时间设置为120 s,发给用户端的应答报文头部中Keep-Alive域的超时时间设置为100 s。
# keepalive_timeout 120s 100s
# 配置单连接请求数上限;
# 此指令可以在http块、server块或location块中配置。
# Nginx服务器端和用户端建立会话连接后,用户端通过此连接发送请求。指令keepalive_requests用于限制用户通过某一连接向Nginx服务器发送请求的次数。默认是100
# keepalive_requests number;
# access_log配置,此指令可以在http块、server块或者location块中进行设置
# 记录Nginx服务器提供服务过程应答前端请求的日志
# # access_log path [format [buffer=size]]
access_log off; # 关闭access_log
# log_format指令,用于定义日志格式,此指令只能在http块中进行配置
# 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;
#负载均衡配置
# upstream 负载均衡
# aliasWddong:虚拟别名,对应 http.server.location里的 proxy_pass 参数;
upstream aliasWddong {
#weight:权重,weigth参数越大被分配到的几率越大。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
# down,backup参数
# server 192.168.80.121:80 down;==>down表示当前的server暂时不参与负载
# server 192.168.80.121:80 backup;==>其它所有的非backup机器down或者忙的时候,请求backup机器。
}
# upstream 的ip_hash方式
# 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
# (并非一定能解决session问题,当手机(车辆上移动)连接,变化到不同的基站时,会造成ip的变化,导致session丢失)
#upstream bakend {
# ip_hash;
# server 192.168.0.14:88;
# server 192.168.0.15:80;
#}
# upstream 的fair方式(第三方)
#按后端服务器的响应时间来分配请求,响应时间短的优先分配。
#upstream backend {
# server server1;
# server server2;
# fair;
#}
# upstream 的url_hash(第三方)
#按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
#upstream backend {
# server squid1:3128;
# server squid2:3128;
# hash $request_uri;
# hash_method crc32;
#}
# server:代表一个虚拟主机
server {
# listen:当前监听的服务器的端口号;
# 三种配置语法。这个指令默认的配置值是:listen *:80 | *:8000;
# 方式一:listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
# 方式二:listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
# 方式三:listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen 80;
# listen 127.0.0.1:8000; #只监听来自127.0.0.1这个IP,请求8000端口的请求
# listen 127.0.0.1; #只监听来自127.0.0.1这个IP,请求80端口的请求(不指定端口,默认80)
# listen 8000; #监听来自所有IP,请求8000端口的请求
# listen *:8000; #和上面效果一样
# listen localhost:8000; #和第一种效果一致
# 如果没配置listen指令,当nginx以超级用户权限运行,则使用*:80,否则使用*:8000。
# 可选参数详解,见下面的章节
# 当前这台虚拟主机的主机名称;
# server_name "";
# 可以只有一个名称,也可以由多个名称并列,之间用空格隔开。每个名字就是一个域名,由两段或者三段组成,之间由点号“.”隔开。
# eg:server_name myserver.com www.myserver.com
server_name localhost;
# 什么是url,什么是uri?
# `https://www.baidu.com/test/tieba.html/` ===> url
# 域名:`https://www.baidu.com/`
# `/test/tieba.html/` ===> uri
# location:匹配 uri
location /{
# 代理
# proxy_pass 一个具体的地址 | 一组服务器(配合upstream使用);
# proxy_pass http://aliasWddong; 反向代理到上面upstream配置的aliasWddong一组服务器上;
proxy_pass http://www.XXX.com;
# 反向代理不支持https服务器,https服务器需要域名和证书对应上;
# 当匹配到“/”之后,就会代理到 “http://www.XXX.com” 地址上;
# 需要注意的是 proxy_pass 和下方的 root 配置同时存在时,只能同时生效一个;(上方的配置会生效);
#拒绝的ip
# deny 127.0.0.1;
#允许的ip
# allow 172.18.5.54;
# root:匹配到location 之后,从哪个(html)目录下去找资源文件;
# html:指的是相对路径(/usr/local/nginx)(nginx的主目录);
root html;
# 匹配location之后,后缀是index的话,默认去找index.html或者index.htm文件;
index index.html index.htm;
}
# 错误页面,当服务器发生 500 502 503 504 等错误码时,找 域名 + /50x.html 页面;
# `https://www.baidu.com/50x.html`
error_page 500 502 503 504 /50x.html;
# 匹配上面的 /50x ;
location /50x.html{
# 找到相对路径下的 html 文件夹下的 /50x.html 页面;
root html;
}
}
}
更多详细配置解析:Nginx 配置文件nginx.conf中文详解
5.3 http.server.listen 可选参数解析- default_server:假如通过Host没匹配到对应的虚拟主机,则通过这台虚拟主机处理。
- backlog=number:设置监听函数listen()最多允许多少网络连接同时处于挂起状态,在FreeBSD中默认为-1,其他平台默认为511。
- accept_filter=filter,设置监听端口对请求的过滤,被过滤的内容不能被接收和处理。本指令只在FreeBSD和NetBSD 5.0+平台下有效。filter可以设置为dataready或httpready,感兴趣的读者可以参阅Nginx的官方文档。
- bind:标识符,使用独立的bind()处理此address:port;一般情况下,对于端口相同而IP地址不同的多个连接,Nginx服务器将只使用一个监听命令,并使用bind()处理端口相同的所有连接。
- ssl:标识符,设置会话连接使用SSL模式进行,此标识符和Nginx服务器提供的HTTPS服务有关。
程序员自由之路:Nginx配置文件详解
菜鸟教程:Nginx 配置详解



