nginx-从入门到精(fang)通(qi)

1. nginx的安装

windows下nginx的安装及使用

windows server服务器安装nginx出现错误1113: No mapping for the Unicode character exists in the target multi-byte code page

2. nginx的特点

2.1 nginx正向代理与反向代理

正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚具体来自哪个客户端。正向代理模式屏蔽或隐藏了真实的客户端信息。

正向代理

反向代理主要用于服务器集群分布式部署的情况,隐藏服务器的信息。nginx服务器收到请求后,按照一定的规则分发给后端的业务服务器进行处理。请求来源也就是客户端是明确的,但是请求具体由那台服务器处理是不明确的。

反向代理

举例说明:面试官(服务器),HR小姐姐(代理服务器),领导(反向代理),应聘者(客户端)。
正向代理:我想来贵公司面试,只能给HR小姐姐发送简历。HR小姐姐就像一个正向代理。
反向代理:我过来面试后,HR小姐姐通知领导后,领导安排一个面试官。领导就像一个反向代理。

2.2 负载均衡

我们理解了代理服务器的概念,那么,nginx扮演了反向代理的角色,它是依靠什么样的规则进行请求分发呢?

负载均衡策略
  1. weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight 温特),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。

  2. ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。

  3. fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair 烦儿算法,如果要使用这种调度算法,请安装upstream_fair模块

  4. url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包

3. Nginx的配置

nginx的配置主要集中在nginx.conf这个配置文件中,并且所有的配置选项大概可以分为以下几个部分。


main                                # 全局配置
 
events {                            # nginx工作模式配置
 
}
 
http {                                # http设置
    ....
 
    server {                        # 服务器主机配置
        ....
        location {                    # 路由配置
            ....
        }
 
        location path {
            ....
        }
 
        location otherpath {
            ....
        }
    }
 
    server {
        ....
 
        location {
            ....
        }
    }
 
    upstream name {                    # 负载均衡配置
        ....
    }
}

如上述配置文件,主要由6部分组成

  1. main:主要进行nginx全局信息的配置;
  2. events:用于nginx工作模式的配置;
  3. http:用于进行http协议的信息;
    3.1 server:用于进行服务器访问信息的配置;
    3.1.1 location:(定位)用于进行访问路由的配置;
    3.2 upstream:(上游)用于进行负载均衡的配置;
各个模块的作用.png

3.1 main模块

# 定义Nginx运行的用户和用户组,默认nobody账号运行。
user nobody nobody;
#nginx进程数,建议设置为等于CPU总核心数
worker_processes 2;
# 定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】
error_log logs/error.log
error_log logs/error.log notice
error_log logs/error.log info
#用于指定进程id的存储文件的位置。
pid logs/nginx.pid
#worker_rlimit_nofile: 用于指定一个进程可以打开最多文件数量的描述。
worker_rlimit_nofile 1024;

3.2 event模块

event {
    #worker_connections是单个后台worker process进程的最大并发链接数,并发总数是 worker_processes 和 worker_connections 的乘积, 即 max_clients = worker_processes * worker_connections
    worker_connections 1024;
    #指定nginx在收到一个新连接通知后尽可能多的接受更多的连接。
    multi_accept on;
    #use epoll:配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue。
    use epoll;
}

3.3 http模块

作为web服务器,http模块是nginx最核心的一个模块,配置项也是比较多的。常规请求下,使用默认配置即可。

http {
    ##
    # 基础配置
    ##
    # 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来 输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置 为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常 把这个改成off。
    sendfile on;
    #让nginx在一个数据包中发送所有的头文件,而不是一个一个单独发
    tcp_nopush on;
    # 让nginx不要缓存数据,而是一段一段发送,如果数据的传输有实时性的要求的话可以配置它,发送完一小段数据就立刻能得到返回值,但是不要滥用哦
    tcp_nodelay on;
    # 长连接超时时间,单位是秒
    keepalive_timeout 65;
    #混淆数据,影响三列冲突率,值越大消耗内存越多,散列key冲突率会降低,检索速度更快;值越小key,占用内存较少,冲突率越高,检索速度变慢
    types_hash_max_size 2048;
    #虽然不会让nginx执行速度更快,但是可以在错误页面关闭nginx版本提示,对于网站安全性的提升有好处哦
    # server_tokens off;
 
    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;
     #指定在当前文件中包含另一个文件的指令
    include /etc/nginx/mime.types;
    #指定默认处理的文件类型可以是二进制
    default_type application/octet-stream;
 
    ##
    # SSL证书配置
    ##
 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;
 
    ##
    # 日志配置
    ##
    #设置存储访问记录的日志
    access_log /var/log/nginx/access.log;
    #设置存储记录错误发生的日志
    error_log /var/log/nginx/error.log;
 
    ##
    # Gzip 压缩配置
    ##
    #是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。
    gzip on;
    #为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。
    gzip_disable "msie6";
 
    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript
    text/xml application/xml application/xml+rss text/javascript;
 
    ##
    # 虚拟主机配置,可以直接去读取
    ##
 
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

3.3.1 http模块下的server模块

server模块配置是http模块的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息。

虚拟主机的定义
server {
    #可匹配虚拟主机的ip+端口
    listen        80;
    #用于指定ip地址或域名,多个配置之间用空格分隔。
    server_name localhost    192.168.1.100;
    #表示整个server虚拟主机内的根目录,所有当前主机中web项目的根目录
    root        /nginx/www;
    #用户访问web网站时的全局首页
    index        index.php index.html index.html;
    #用于设置www/路径中配置的网页的默认编码格式
    charset        utf-8;
    #用于指定该虚拟主机服务器中的访问记录日志存放路径
    access_log    logs/access.log;
    # 用于指定该虚拟主机服务器中访问错误日志的存放路径
    error_log    logs/error.log;
    ......
}

Nginx在决定请求由哪个server块执行时,主要关注的是server块中的listener和server_name字段。

listener命令

listener字段定义server响应ip和端口如果没有明确配置listen字段,默认监听0.0.0.0:80(root)或者0.0.0.0:8080(非root)。

listener可以配置为:

  1. 一个ip和端口的组合

  2. 一个单独的ip,默认监听80端口

  3. 一个单独的端口,默认监听所有的ip接口

  4. 一个Unix socket路径

只要当listen指令无法找到最佳匹配时才会考虑评估server_name参数。即通过listen配置,找到多个server块。

多个listen匹配时,将使用server_name进行进一步的精确匹配

server_name指令

如果根据listener指令无法得到最佳匹配,将开始解析server_name指令。nginx将会检查请求中的“Host”头,这个值包含了客户端试图请求的域名或者ip地址。nginx会根据这个值去匹配server_name指令。

3.3.1.1 server模块下的location模块

当server根据listener或者server_name确定某个请求由server进行处理后,或根据location /jenkins配置,根据url路径上的信息路由某个地址上。

location模块是nginx配置出现最多的一个配置,主要用于配置路由访问信息。

基本配置

#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
    proxy_pass http://tomcat:8080/index
}
 
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {                              //以xx开头
    root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {     //以xx结尾
    root /webroot/res/;
}
 
#第三个规则就是通用规则,用来转发动态请求到后端应用服务器
#非静态文件请求就默认是动态请求,自己根据实际把握
location  ~  ^/(biology|chemistry)/exam/(.*)  {
    proxy_pass http://backend;   #反向代理地址
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # (biology|chemistry)是第一个通配符
    proxy_set_header subject $1;

    # $2是第二个通配符
    proxy_pass http://manager-api/$2;
}

3.3.2 http模块下的upstream模块

upstream模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器。

upstream backend{
    #ip_hash:指定请求调度算法,默认是weight权重轮询调度,可以指定
    ip_hash;
    #server host:port:分发服务器的列表配置
    server 192.168.1.100:8000;
    # down 表示该主机暂停服务
    server 192.168.1.100:8001 down;
    # max_fails:表示失败最大次数,超过失败最大次数暂停服务
    server 192.168.1.100:8002 max_fails=3;
   # fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求
    server 192.168.1.100:8003 fail_timeout=20s;
    server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}

4. nginx整体流程

整体流程.png
  1. 用户请求到达nginx服务器后,根据serve的listen和server_name找到具体的虚拟访问主机。
  2. 根据url的不同,找到server模块中的location。
  3. 根据location模块中的proxy_pass(反向代理配置),找到具体的upstream。
  4. 根据upstream的负载策略,直接请求到相应的服务器地址。

5. 遇到的问题以及处理方案

Nginx报502错误,日志connect() failed (111: Connection refused) while connecting to upstream的最终完美有效解决方案

文章参考

nginx location配置详细解释

Nginx详解(正向代理、反向代理、负载均衡原理)

理解Nginx中Server和Location的匹配逻辑

nginx.conf配置文件解析(http、server、location)

nginx中 $1,$2,$3是什么?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容

  • 大多数 Nginx 新手都会频繁遇到这样一个困惑,那就是当同一个location配置块使用了多个 Nginx 模块...
    SkTj阅读 7,412评论 0 12
  • 一、安装Nginx: 1、解决依赖关系 yum groupinstall "Development Tools" ...
    不排版阅读 801评论 0 0
  • 1.简介:  Nginx:engine X ,2002年,开源,商业版 http协议:web服务器(类似于ht...
    尛尛大尹阅读 1,833评论 0 3
  • I/O模型Nginx介绍Nginx的安装和目录结构Nginx的配置Nginx的编译安装 一、I/O模型 (一)I/...
    哈喽别样阅读 866评论 0 4
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,964评论 0 9