nginx入门教程

       nginx是什么:nginx是一个高性能的HTTP和反向代理web服务器。同时也提供了IMAP/POP3/SMTP服务。

       nginx特点:开源、占内存少、轻量级、高性能(有报告表面nginx能支持高达 500000个并发连接数)、支持热部署。

       在正式介绍nginx之前,我们先来介绍几个相关的名词:正向代理、反向代理、负载均衡、动静分离。

  • 正向代理、反向代理

       正向代理和反向代理的主要区别在代理的对象不一样:正向代理代理的对象是客户端;反向代理代理的对象是服务端。

       正向代理,代理的对象是客户端。顺着请求的方向进行代理。正向代理的过程,隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求。

       A同学在大众创业、万众创新的大时代背景下开启他的创业之路,目前他遇到的最大的一个问题就是启动资金,于是他决定去找马云爸爸借钱,可想而知,最后碰一鼻子灰回来了,情急之下,他想到一个办法,找关系开后门,经过一番消息打探,原来A同学的大学老师王老师是马云的同学,于是A同学找到王老师,托王老师帮忙去马云那借500万过来,当然最后事成了。不过马云并不知道这钱是A同学借的,马云是借给王老师的,最后由王老师转交给A同学。这里的王老师在这个过程中扮演了一个非常关键的角色,就是代理,也可以说是正向代理,王老师代替A同学办这件事,这个过程中,真正借钱的人是谁,马云是不知道的,这点非常关键。

       反向代理,代理的对象是服务端反向代理的过程,隐藏了真正的服务端。客户端不知道真正的服务端是谁。

       拨打10086客服电话,可能一个地区的10086客服有几个或者几十个,你永远都不需要关心在电话那头的是哪一个,叫什么,男的,还是女的,漂亮的还是帅气的,你都不关心,你关心的是你的问题能不能得到专业的解答,你只需要拨通了10086的总机号码,电话那头总会有人会回答你,只是有时慢有时快而已。那么这里的10086总机号码就是我们说的反向代理。客户不知道真正提供服务人的是谁。

所以,正向代理、反向代理咱们只要记住一点就好了,正向代理的对象是客户端;反向代理的对象是服务端。正向代码服务端不知道客户端,隐藏的是客户端;反向代理客服端不知道服务端,隐藏的是服务端。

  • 负载均衡

    负载均衡英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。负载均衡说白了就是单个服务器处理不过来了,通过增加服务器数量,把客户端的请求平均分布在不同的服务器上去处理,平衡工作量。一般在高并发场景下使用。

  • 动静分离

    动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。

    将动态请求和静态请求区分访问。html、css、js属于静态资源;url请求、jsp、servlet属于动态资源。

    如何动静分离:把静态资源放在静态资源服务器上(Nginx服务器),动态资源部署在tomcat服务器上。Nginx根据客户端请求的url来判断请求的是否是静态资源,如果请求的url包含jpg、png,则由Nginx处理;如果请求的url是.php或者.jsp等等,这个时候这个请求是动态的,将转发给tomcat处理。

一 nginx安装

1.1 windows下nginx的安装

1.1.1 nginx下载

       进入官网http://nginx.org/en/download.html 下载对应的稳定版本到本地(比如这里我们下载的是nginx-1.18.0.zip)。

image-20200504142607281.png

1.1.2 nginx安装&启动

       下载成功之后,解压下载的文件到指定目录。双击nginx.exe就启动了nginx。nginx默认监听的是80端口。

image-20200504143236544.png

       在浏览器里面输入 http://127.0.0.1:80 成功访问到nginx。

image-20200504143613344.png

1.2 linux下nginx安装

1.2.1 nginx依赖安装

       在安装nginx前首先要确认系统中正确安装了gcc、pcre-devel、zlib-devel、openssl、openssl-devel

# 查看是否安装了**gcc、pcre-devel、zlib-devel、openssl、openssl-devel**
yum list installed | grep "gcc" # 判断是否按照了gcc
yum list installed | grep "pcre-devel" # 判断是否按照了pcre-devel
yum list installed | grep "zlib-devel" # 判断是否按照了zlib-devel
yum list installed | grep "openssl" # 判断是否按照了openssl
yum list installed | grep "openssl-devel" # 判断是否按照了openssl-devel

# 哪个没有安装就相应的安装上
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel

1.2.2 nginx下载

       进入官网下载对应系统的稳定版本。http://nginx.org/en/download.html

image-20200530140325937.png

1.2.3 nginx安装&启动

## 解压,注意对应的文件
tar -zxvf nginx-1.18.0.tar.gz

##进入解压后的nginx目录
cd nginx-1.18.0

## 配置
./configure --prefix=/usr/local/nginx

# make
make
make install

# 查看是否按照成功 -- 查看nginx版本号
/usr/local/nginx/sbin/nginx -v

# 安装之后启动nginx
/usr/local/nginx/sbin/nginx

# 查看安nginx是否启动成功(查看是否有nginx对应的进程)
ps -ef|grep nginx

# 再次在浏览器里面输入对应地址查看nginx是否真的启动成功(80端口)
# 如果你发现浏览器里面访问不了,
# 查看下防火墙的状态
firewall-cmd --state

# 停止firewall
systemctl stop firewalld.servic

# 禁止firewall开机启动
systemctl disable firewalld.service

1.2.4 nginx命令添加到系统变量中

       把nginx命令添加到系统变量中之后,我们每次使用nginx命令的时候就不用输入全路径了。

# 进入系统环境变量配置文件
vi /etc/profile

# 在文件的末尾添加 保存退出
# add for nginx /usr/local/nginx/sbin 是 Nginx sbin目录
export PATH=$PATH:/usr/local/nginx/sbin

# 使配置文件生效
source /etc/profile

1.2.5 nginx添加到系统服务

       因为我们是用源码编译安装的,所以要手动创建nginx.service服务文件。把nginx添加到系统服务之后,我们启停nginx或者开机自启动nginx都是很方便的。

vi /lib/systemd/system/nginx.service

# 添加如下内容
[Unit]
Description=nginx
After=network.target
  
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
  
[Install]
WantedBy=multi-user.target


# 设置开机启动
systemctl enable nginx.service

# 启动nginx服务
systemctl start nginx.service 

# 重新启动nginx服务
systemctl restart nginx.service 

# 停止ngixn服务
systemctl stop nginx.service 

二 nginx常用命令

  • 启动nginx
# windos下直接双击 nginx.exe 就可以了

# linux下
/usr/local/nginx/sbin/nginx    #直接启动nginx,注意nginx路径

nginx   # nginx命令添加到系统变量中之后才可以这样使用

systemctl start nginx.service  #安装咱们上的安装步骤,nginx添加到系统服务服务之后才可以用这样养

  • 查看版本
nginx -v  # 查看版本 
nginx -V  # 详细版本信息,包括编译参数 
  • 重新加载ningx(不需要重启,每次修改之后都可以使用该命令让修改生效)
nginx -s reload
  • 检查配置文件
nginx -t
  • 关闭nginx
nginx -s stop
# 或者
nginx -s quit
  • 查看帮助信息
nginx -h 
  • 指定配置文件
nginx  -c filename
  • 重新打开日志文件,一般用于切割日志
nginx -s reopen

三 nginx配置文件详解

       ningx配置文件的路径,默认情况下:

  • windows下系统nginx配置文件路径:在解压之后目录下的 conf/nginx.conf

  • linux系统下nginx配置文件路径(如果安装目录是/usr/local/nginx):/usr/local/nginx/conf/nginx.conf

nginx.conf配置文件实例

#################################  main config start  ###############################

#定义nginx运行的用户和用户组
user www www;

#nginx进程数,建议设置为等于CPU总核心数
worker_processes 4;

#全局错误日志定义类型,[debug | info | notice | warn | error | crit]
#error_log  /data/nginx/logs/error.log;
#error_log  /data/nginx/logs/error.log  notice;

#日志文件存放路径 access_log path [format [buffer=size | off]]
#access_log /data/nginx/logs/lazyegg.com/web/access.log combinedio;

#在高并发情况下,通过设置将CPU和具体的进程绑定来降低由于多核CPU切换造成的寄存器等现场重建带来的性能损耗
#worker_cpu_affinity 0001 0010 0100 1000;

#进程pid文件
#pid        logs/nginx.pid;

#指定进程可以打开的最大描述符:数目
#工作模式与连接数上限
##这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
#这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。
worker_rlimit_nofile 65535;

#################################  main config end  ###############################

#################################  events config start  ###############################
events {
    #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型
    use epoll
    
    #单个进程最大连接数(最大连接数=连接数+进程数)
    worker_connections  1024;
    
    #惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进程能获得链接,这样会影响系统性能。设置网路连接序列化,防止惊群现象发生,默认为on
    accept_mutex on;
    
    #设置是否允许同时接受多个网络连接(默认是关闭的)
    multi_accept on;
    
    #keepalive 超时时间
    keepalive_timeout 60;
    
    #客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为系统分页大小。查看系统分页可以使用 getconf PAGESIZE命令
    client_header_buffer_size 4k;
    
    #这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。
    open_file_cache max=65535 inactive=60s;
    #这个是指多长时间检查一次缓存的有效信息。
    open_file_cache_valid 80s;
    #open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。
    open_file_cache_min_uses 1;
    
    #语法:open_file_cache_errors on | off 默认值:open_file_cache_errors off 使用字段:http, server, location 这个指令指定是否在搜索一个文件是记录cache错误.
    open_file_cache_errors on;
}
#################################  events config end  ###############################

##############################   http    ##################################

#设定http服务器,利用它的反向代理功能提供负载均衡支持
http{
    #文件扩展名与文件类型映射表
    include mime.types;
    
    #默认文件类型
    default_type application/octet-stream;
    
    #默认编码
    charset utf-8;
    
    #服务器名字的hash表大小
    server_names_hash_bucket_size 128;
    
    #客户端请求头部的缓冲区大小。
    client_header_buffer_size 32k;
    
    #客户请求头缓冲大小。
    large_client_header_buffers 4 64k;
    
    #允许客户端请求的最大单个文件字节数
    client_max_body_size 8m;
    
    #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
    sendfile on;
    
    #开启目录列表访问,适合下载服务器,默认关闭。
    autoindex on;
    
    #此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
    tcp_nopush on;
     
    tcp_nodelay on;
    
    #长连接超时时间,单位是秒
    keepalive_timeout 120;
    
    #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    
    #gzip模块设置
    gzip on; #开启gzip压缩输出
    gzip_min_length 1k;    #最小压缩文件大小
    gzip_buffers 4 16k;    #压缩缓冲区
    gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
    gzip_comp_level 2;     #压缩等级
    gzip_types text/plain application/x-javascript text/css application/xml;    #压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
    gzip_vary on;

    #开启限制IP连接数的时候需要使用
    #limit_zone crawler $binary_remote_addr 10m;
    
    #负载均衡配置
    upstream realserver {
        #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
        server 192.168.1.1 weight=5;
        server 192.168.1.2 weight=8;
    }
    #nginx默认支持的调度算法
    #1. 按照顺序轮询
    #upstream realserver {
    #   server 192.168.1.1;
    #   server 192.168.1.2;
    #}
    #2. weight和访问比率成正比,用于后端服务器性能不均的情况
    #upstream realserver {
    #   server 192.168.1.1 weight=5;
    #   server 192.168.1.2 weight=8;
    #}
    #3. ip_has,这样能够使某个ip固定访问一台后端的服务器,可以有效解决用户session问题
    #upstream realserver {
    #   ip_hash;
    #   server 192.168.1.1;
    #   server 192.168.1.2;
    #}
    #4. fair(第三方插件)按照后端服务器的响应速度来分配请求,响应时间短的会优先分配
    #upstream realserver {
    #   server 192.168.1.1;
    #   server 192.168.1.2;
    #   fair;
    #}
    #5. url_hash(第三方)
    #upstream realserver {
    #   server 192.168.1.1;
    #   server 192.168.1.2;
    #   hash $request_uri;
    #   hash_method crc32;
    #}
    #6. upstream还能够为每一个设备设置状态值
    # down: 表示该设备处于停用状态
    # backup: 表示该设备是备用设备,只有在除他之外所有设备宕机或者很忙的时候才会被分配到请求。
    # weight: 表示权重,数值越大,则被请求的几率越大。
    # max_fails和fail_timeout一般为关联使用,
    # max_fails设置允许请求失败的次数,默认为1。
    # fail_timeout设置请求失败n次后多长时间不再请求该服务,默认为10s。
    #upstream bakend{
    #   ip_hash; 
    #   server 10.0.0.11:9090 down; 
    #   server 10.0.0.11:8080 weight=2; 
    #   server 10.0.0.11:6060; 
    #   server 10.0.0.11:7070 backup; 
    #}
    
    #虚拟主机的配置
    server {
        #监听端口
        listen 80;

        #域名可以有多个,用空格隔开
        server_name lazyegg.net;
        #默认入口文件名称
        index index.html index.htm index.php;
        root /data/www/lazyegg;

        #对******进行负载均衡
        location ~ .*.(php|php5)?$
        {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
         
        #图片缓存时间设置
        location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires 10d;
        }
         
        #JS和CSS缓存时间设置
        location ~ .*.(js|css)?$
        {
            expires 1h;
        }
         
        #日志格式设定
        #$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
        #$remote_user:用来记录客户端用户名称;
        #$time_local:用来记录访问时间与时区;
        #$request:用来记录请求的url与http协议;
        #$status:用来记录请求状态;成功是200,
        #$body_bytes_sent :记录发送给客户端文件主体内容大小;
        #$http_referer:用来记录从那个页面链接访问过来的;
        #$http_user_agent:记录客户浏览器的相关信息;
        #通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
        log_format access '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" $http_x_forwarded_for';
         
        #定义本虚拟主机的访问日志
        access_log  /usr/local/nginx/logs/host.access.log  main;
        access_log  /usr/local/nginx/logs/host.access.404.log  log404;
         
        #对 "/connect-controller" 启用反向代理
        location /connect-controller {
            proxy_pass http://127.0.0.1:88; #请注意此处端口号不能与虚拟主机监听的端口号一样(也就是server监听的端口)
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
             
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             
            #以下是一些反向代理的配置,可选。
            proxy_set_header Host $host;

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

            #缓冲区代理缓冲用户端请求的最大字节数,
            #如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。
            #无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误
            client_body_buffer_size 128k;

            #表示使nginx阻止HTTP应答代码为400或者更高的应答。
            proxy_intercept_errors on;

            #后端服务器连接的超时时间_发起握手等候响应超时时间
            #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_connect_timeout 90;

            #后端服务器数据回传时间(代理发送超时)
            #后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
            proxy_send_timeout 90;

            #连接成功后,后端服务器响应时间(代理接收超时)
            #连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
            proxy_read_timeout 90;

            #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            #设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小
            proxy_buffer_size 4k;

            #proxy_buffers缓冲区,网页平均在32k以下的设置
            #设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k
            proxy_buffers 4 32k;

            #高负荷下缓冲大小(proxy_buffers*2)
            proxy_busy_buffers_size 64k;

            #设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
            #设定缓存文件夹大小,大于这个值,将从upstream服务器传
            proxy_temp_file_write_size 64k;
        }
        
        #本地动静分离反向代理配置
        #所有jsp的页面均交由tomcat或resin处理
        location ~ .(jsp|jspx|do)?$ {
            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://127.0.0.1:8080;
        }
    }
}

nginx.conf配置文件主要分为三部分:main(全局块)、events块、https块。

image-20200504153248577.png

nginx.conf配置文件配置语法:

  • 配置文件由指令和指令块构成。
  • 每条指令以分号(;)结尾,指令和参数间以空格符分隔。
  • 指令块以大括号{}将多条指令组织在一起。
  • include语句允许组合多个配置文件以提高可维护性。
  • 使用 # 添加注释。
  • 使用 $ 定义变量。
  • 部分指令的参数支持正则表达式。

3.1 全局块(main)配置

       全局块(main)指的是从配置文件开始到events块之间的配置内容内容,全局配置部分用来配置对整个server都有效的参数,这些配置指令主要是设置一些影响nginx服务器整体运行的配置指令。主要包括配置运行 nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。

main全局配置常用的配置指令

全局块(main)配置 解释 实例
user 定义nginx运行的用户和用户组 user www www;
worker_processes nginx进程数,建议设置为等于CPU总核心数 worker_processes 4;
worker_cpu_affinity 在高并发情况下,通过设置将CPU和具体的进程绑定来降低由于多核CPU切换造成的寄存器等现场重建带来的性能损耗 worker_cpu_affinity 0001 0010 0100 1000; (四核)
error_log 全局错误日志定义类型,[debug | info | notice | warn | error | crit] error_log /data/nginx/logs/error.log;
access_log 日志文件存放路径 access_log path [format [buffer=size | off]] access_log /data/nginx/logs/lazyegg.com/web/access.log combinedio;
pid 指定进程pid文件的位置 /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 用于指定一个nginx进程可以打开的最多文件描述符数目 worker_rlimit_nofile 65535;

3.2 event块配置

       event块主要是配置一些影响nginx服务器与用户的网络连接,常用的设置包括是否开启多work process下的网络连接进行序列化,是否运行同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个word prcess可以同时支持的最大连接数等。

event里面常用的配置指令如下。

event配置项 解释 实例
use use是个事件模块指令,用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/pol use epoll;
worker_connections 工作进程的最大连接数量, 理论上每台nginx服务器的最大连接数为worker_processes*worker_connections worker_connections 2000;
accept_mutex 惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进程能获得链接,这样会影响系统性能。设置网路连接序列化,防止惊群现象发生,默认为on accept_mutex on;
multi_accept 设置是否允许同时接受多个网络连接(默认是关闭的) multi_accept on;
keepalive_timeout keepalive超时时间。 这里指的是http层面的keep-alive 并非tcp的keepalive keepalive_timeout 60;
client_header_buffer_size 客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为系统分页大小。查看系统分页可以使用 getconf PAGESIZE命令 client_header_buffer_size 4k;
open_file_cache 这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。 open_file_cache max=2000 inactive=60s;
open_file_cache_valid 这个是指多长时间检查一次缓存的有效信息。如果有一个文件在inactive时间内一次没被使用,它将被移除 open_file_cache_valid 60s;
open_file_cache_min_uses open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如果有一个文件在inactive时间内一次没被使用,它将被移除 open_file_cache_min_uses 1;
open_file_cache_errors 这个指令指定是否在搜索一个文件是记录cache错误 open_file_cache_errors on;

use是个事件模块指令,用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统,epoll工作模式是首选。在操作系统不支持这些高效模型时才使用select。

3.3 http块配置

       http块配置是nginx服务器配置中最频繁的部分,代理、缓存和日志文件定义等绝大多数功能和第三方模块的配置项都在这个里面。http配置包括两个部分:http全局块、upstream块、server块。

3.3.1 http全局块配置

       http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时、单链接请求数上限等等都是在这里配置的。

http全局块配置(通用) 解释 实例
include 定义nginx能识别的网络资源媒体类型(如,文本、html、js、css、流媒体等,cat conf/mime.types) include mime.types;
default_type 默认文件类型 default_type application/octet-stream;
charset 指定客户端编码格式 charset utf-8;
log_format 定义日志格式
access_log 定义日志的路径以及采用的日志格式 access_log logs/access.log main;
server_names_hash_bucket_size 服务器名字的hash表大小 server_names_hash_bucket_size 128;
limit_zone 开启限制IP连接数的时候需要使用 limit_zone crawler $binary_remote_addr 10m;
3.3.1.1 HTTP参数之客户端相关配置指令
HTTP参数之客户端相关配置指令 解释 实例
client_header_buffer_size 用来指定来自客户端请求头的header buffer 大小。对于大多数请求,1K的缓存已经足够了,如果自定义了消息头或有更大的cookie,可以增大缓存区大小。 client_header_buffer_size 32k;
client_header_timeout 读取整个header的超时时间 client_header_timeout 60;
large_client_header_buffers 用来指定客户端请求中较大的消息头的缓存最大数量和大小,4为个数,128k为大小,最大缓存为4个128KB。 large_client_header_buffers 4 128k;
client_max_body_size 浏览器在发送含有较大HTTP包体的请求时,其头部会有一个Content-Length字段,client_max_body_size是用来限制Content-Length所示值的大小的。 client_max_body_size 8m;
sendfile_max_chunk 该参数限定Nginx worker process每次调用sendfile()函数传输数据的最大值,默认值为0,如果设置为0则无限制。配合上边sendfile 选项一起使用 sendfile_max_chunk 128k;
client_body_buffer_size 在接收HTTP包体时,如果包体的大小大于client_body_buffer_size,则会以一个递增的整数命名并存放到client_body_temp_path指定的目录中 client_body_buffer_size 128k;
sendfile 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,减少用户空间到内核空间的上下文切换。对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。开启 tcp_nopush on;tcp_nodelay on; 防止网络阻塞。 sendfile on ;
autoindex 开启目录列表访问,适合下载服务器,默认关闭。 autoindex on;
tcp_nopush 防止网络阻塞 tcp_nodelay on;
tcp_nodelay 当tcp_nopush设置为on时,会调用tcp_cork方法进行数据传输 tcp_nopush on;
keepalive_timeout 长连接超时时间,单位是秒,这个参数很敏感,涉及浏览器的种类、后端服务器的超时设置、操作系统的设置,可以另外起一片文章了。长连接请求大量小文件的时候,可以减少重建连接的开销,但假如有大文件上传,65s内没上传完成会导致失败。如果设置时间过长,用户又多,长时间保持连接会占用大量资源。 keepalive_timeout 65 :
client_body_timeout 用于设置客户端请求主体读取超时时间,默认是60s。如果超过这个时间,客户端还没有发送任何数据,nginx将返回Request time out(408)错误。 client_body_timeout 60s;
send_timeout 用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。 limit_zone crawler $binary_remote_addr 10m;
3.3.1.2 HTTP参数之FastCGI参数配置指令

       FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。

HTTP之FastCGI参数配置指令 解释 实例
fastcgi_connect_timeout 指定连接到后端FastCGI的超时时间 fastcgi_connect_timeout 300;
fastcgi_send_timeout 指定向FastCGI传送请求的超时时间,这个值是已经完成两次握手后向FastCGI传送请求的超时时间。 fastcgi_send_timeout 300;
fastcgi_read_timeout 指定接收FastCGI应答的超时时间,这个值是已经完成两次握手后接收FastCGI应答的超时时间。 fastcgi_read_timeout 300;
fastcgi_buffer_size 用于指定读取FastCGI应答第一部分需要多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以设置为fastcgi_buffers选项指定的缓冲区大小。 fastcgi_buffer_size 64k;
fastcgi_buffers 指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求。如果一个PHP脚本所产生的页面大小为256KB,那么会为其分配4个64KB的缓冲区来缓存;如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。一般这个值应该为站点中PHP脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“16 16k”、“4 64k”等。 fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 默认值是fastcgi_buffers的两倍。 fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 表示在写入缓存文件时使用多大的数据块,默认值是fastcgi_buffers的两倍。 fastcgi_temp_file_write_size 128k;
fastcgi_cache 表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502错误的发生。但是开启缓存也会引起很多问题,要视具体情况而定。 fastcgi_cache TEST;
fastcgi_cache_path FastCGI缓存指定一个文件路径、目录结构等级、关键字区域存储时间和非活动删除时间。 fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
fastcgi_cache_valid 用来指定应答代码的缓存时间。实例中的值表示将200和302应答缓存一个小时,将301应答缓存1天,其他应答均缓存1分钟。 fastcgi_cache_valid 200 302 1h;
3.3.1.3 HTTP参数之gzip模块设置配置指令
HTTP之gzip模块设置配置指令 解释 实例
gzip 开启gzip压缩输出 gzip on;
gzip_min_length 最小压缩文件大小,页面字节数从header头的Content-Length中获取。默认值为0,不管多大页面都压缩,建议设置成大于1K的字节数,小于1K可能会越压越大。 gzip_min_length 1k;
gzip_buffers 压缩缓冲区,表示申请四个16K的内存作为压缩结果流缓存,默认是申请与原始数据大小相同的内存空间来存储gzip压缩结果。 gzip_buffers 4 16k;
gzip_http_version 用于设置识别HTTP协议版本,默认是1.1,目前主流浏览器都已成指出。(默认1.1,前端如果是squid2.5请使用1.0) gzip_http_version 1.1;
gzip_comp_level 压缩等级,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是消耗CPU资源。 gzip_comp_level 6;
gzip_types 压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。 gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary 和http头有关系,会在响应头加个 Vary: Accept-Encoding ,可以让前端的缓存服务器缓存经过gzip压缩的页面,例如,用Squid缓存经过Nginx压缩的数据。 gzip_vary on;
gzip_proxied Nginx作为反向代理的时候启用,决定开启或者关闭后端服务器返回的结果是否压缩,匹配的前提是后端服务器必须要返回包含”Via”的 header头。 gzip_proxied any;

3.3.2 upstream块配置

       有的时候我们需要给nginx配置上游服务器,即负载均衡到的真实处理业务的服务器,通过在http指令下配置upstream即可。如果想用upstream对应的负载均衡配置可以将server节点下的location节点中的proxy_pass配置为:http:// + upstream名称即可。nginx默认支持的调度算法:

3.3.2.1 轮询方式(默认)

       按照顺序轮询。

upstream realserver {
    server 192.168.1.1;
    server 192.168.1.2;
}
3.3.2.2 weight权重

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

upstream realserver {
    server 192.168.1.1 weight=5;
    server 192.168.1.2 weight=8;
}
3.3.2.3 ip_hash

       这样能够使某个ip固定访问一台后端的服务器,可以有效解决用户session问题

upstream realserver {
    ip_hash;
    server 192.168.1.1;
    server 192.168.1.2;
}
3.3.2.4 fair(第三方插件)

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

upstream realserver {
    server 192.168.1.1;
    server 192.168.1.2;
    fair;
}
3.3.2.5 url_hash(第三方)

按照url的hash结果来分配请求,使每一个url地址请求到同一台后端服务器,后端服务器为缓存服务器时比较有效。此时不可使用weight等参数

upstream realserver {
    server 192.168.1.1;
    server 192.168.1.2;
    hash $request_uri;
    hash_method crc32;
}

upstream还能够为每一个设备设置状态值,这些状态值的含义分别例如以下:

upstream bakend{
      ip_hash; 
      server 10.0.0.11:9090 down; 
      server 10.0.0.11:8080 weight=2; 
      server 10.0.0.11:6060; 
      server 10.0.0.11:7070 backup; 
}
  • down: 表示该设备处于停用状态

  • backup: 表示该设备是备用设备,只有在除他之外所有设备宕机或者很忙的时候才会被分配到请求。

  • weight: 表示权重,数值越大,则被请求的几率越大。

  • max_fails和fail_timeout一般为关联使用,

  • max_fails设置允许请求失败的次数,默认为1。

  • fail_timeout设置请求失败n次后多长时间不再请求该服务,默认为10s。

3.3.3 server块配置

       server块用于配置虚拟主机相关参数,而且一个http中可以有多个server。

虚拟主机是一种特殊的软硬件技术,它可以将网络上的没一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是相互独立的,互不影响。

  • 基于ip的虚拟主机, (一块主机绑定多个ip地址)
  • 基于域名的虚拟主机(servername)
  • 基于端口的虚拟主机(listen不写ip的端口模式)

每个http块可以包含多个server块,而每个server块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

3.3.3.1 server全局块

       server全局块也被叫做“虚拟服务器”部分,它描述的是一组根据不同server_name指令逻辑分割的资源,这些虚拟服务器响应HTTP请求,因此都包含在http部分。最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。server全局块用于一些常见的配置,本虚拟机主机的监听配置和本虚拟机主机的名称或者IP配置。

server全局块配置指令 解释 实例
listen 监听端口 isten 80;
server_name 监听地址,域名可以有多个,用空格隔开 server_name 127.0.0.1;
keepalive_requests 单连接请求上限次数 keepalive_requests 120;
root root指令用来指定文件在服务器上的基路径 root /usr/local/nginx/html/statics;
charset 字符集 charset utf-8;
access_log 设定本虚拟主机的访问日志 access_log logs/host.access.log main;
error_page 定义错误提示页面 error_page 404 /404.html;
index 首页。下默认访问的文件名,一般跟着root放 index index.jsp index.html index.htm
3.3.3.2 location

       一个 server 块可以配置多个 location 块。location块的主要作用是基于 nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

location块用于配置请求的路由,以及各种页面的处理情况

location配置项指令 解释 实例
proxy_pass 请求转向定义的服务器列表(对应upstream定义的名字) proxy_pass http://mysvr;
stub_status 状态监控相关 stub_status on;
access_log 日志相关 access_log off;
deny 拒绝的ip deny 127.0.0.1;
allow 允许的ip allow 172.18.5.54;
proxy_redirect 重定向 proxy_redirect off;
proxy_set_header Host 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header Host $host;
proxy_set_header X-Real-IP 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 允许客户端请求的最大单文件字节数 client_max_body_size 10m;
client_body_buffer_size 缓冲区代理缓冲用户端请求的最大字节数, client_body_buffer_size 128k;
proxy_connect_timeout nginx跟后端服务器连接超时时间(代理连接超时) proxy_connect_timeout 90;
proxy_send_timeout 后端服务器数据回传时间(代理发送超时) proxy_send_timeout 90;
proxy_read_timeout 连接成功后,后端服务器响应时间(代理接收超时) proxy_read_timeout 90;
proxy_buffer_size 设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffer_size 4k;
proxy_buffers proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 proxy_buffers 4 32k;
proxy_busy_buffers_size 高负荷下缓冲大小(proxy_buffers*2) proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 设定缓存文件夹大小,大于这个值,将从upstream服务器传 proxy_temp_file_write_size 64k;
3.3.3.3 location匹配规则
  • 等号(=):表示完全匹配规则才执行操作
    location = / {
      .....
    }
    # 上下两者等效
    location / {
      .....
    }
    
    # 只匹配http://{domain_name}
    # http://{domain_name} [匹配成功]
    # http://{domain_name}/index [匹配失败]
    
  • 波浪号(~):表示执行正则匹配,但区分大小写
    location ~ /Example/ {
      .....
    }
    
    #http://{domain_name}/Example/ [匹配成功]
    #http://{domain_name}/example/ [匹配失败]
    
  • 波浪号与星号(~*):表示执行正则匹配,但*不* 区分大小写
    location ~* /Example/ {
      .....
    }
    
    # 则会忽略 uri 部分的大小写
    #http://{domain_name}/test/Example/ [匹配成功]
    #http://{domain_name}/example/ [匹配成功]
    
  • 脱字符与波浪号(^~):表示普通字符匹配,前缀匹配有效,配置生效
    location ^~ /index/ {
      .....
    }
    #以 /index/ 开头的请求,都会匹配上
    #http://{domain_name}/index/index.page  [匹配成功]
    #http://{domain_name}/error/error.page [匹配失败]
    
  • @:定义一个location,用于处理内部重定向
    location @error {
        proxy_pass http://error;
    }
    
    error_page 404 @error;
    

四 nginx实例

4.1 nginx配置文件服务器

      nginx文件服务器配置,我们希望在/usr/local/nginx/html/statics路径下随便放入一些图片,最终在浏览器里面输入 http://192.168.101.250/statics/ 能访问到这些图片(端口80,ip需要根据时间情况下)。


#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

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

       # 映射到本地文件系统 
       location /statics{
            root   /usr/local/nginx/html;  #指定文件在服务器上的基路径
            autoindex on; # 索引
            autoindex_exact_size on; # 显示文件大小
            autoindex_localtime on; # 显示文件时间
        }

    }
  

}

image-20200530222258051.png

4.2 nginx配置反向代理

      我们希望在浏览器里面输入http://192.168.101.250/的时候能够自动跳转到http://www.baidu.com

ip根据实际情况做相应的改变,因为这里我们得虚拟机的ip地址是192.168.101.250


worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://www.baidu.com; #直接反向代理到baidu上去
        }

    }

}

情况复杂的话,可以看看nginx带ssl证书的反向代理配置

4.3 nginx配置负载均衡

      nginx的负载均衡主要是对proxy_pass和upstream的配置,同一个请求可能在这台机器上完成,也可能在另一台机器上完成。

      首先,我们通过SpringBoot随便起两个web工程,一个绑定8303端口,一个绑定8304端口。随便你输出什么,来模拟对外提供服务。

8304端口对应的SpringBoot

@RestController
public class TestController extends BaseController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public Response<?> test() {
        return setResult("8304端口");
    }

}

8303端口对应的SpringBoot

@RestController
public class TestController extends BaseController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public Response<?> test() {
        return setResult("8303端口");
    }

}

nginx.conf配置

worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    upstream upstream_name {
        server 192.168.101.230:8303;
        server 192.168.101.230:8304;
    }

    server {
        listen       8080;
        server_name  localhost;

        location / {
            proxy_pass http://upstream_name;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

    }

}

结果验证,请求可能跑到8304端口完成,也可能跑到8303端口完成

image-20200530231044549.png

4.4 nginx配置动静分离

      动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。

      比如如下的配置,如果是静态文件我们就是去/usr/local/nginx/html目录下查找。


worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    
    upstream upstream_name {
        server 192.168.101.230:8303;
        server 192.168.101.230:8304;
    }

    # 静态资源服务器
    upstream static_server {
        server 192.168.101.102;
     }

    server {
        listen       8080;
        server_name  localhost;

        location / {
            proxy_pass http://upstream_name;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        #拦截静态资源
        #location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
        #    proxy_pass http://static_server;
        #    proxy_set_header X-Real-IP $remote_addr;
        #}
        location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
            root   /usr/local/nginx/html;
        }
    }

}

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