Nginx学习(入门)


一、Nginx简介.

1、什么是Nginx?.

Nginx (engine x) 是一个高性能的HTTP反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。

其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

Nginx是一款轻量级Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东新浪网易腾讯淘宝等。

Nginx,可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如perl、php等。但是不支持 java。Java程序只能通过与tomcat配合完成。Nginx.专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达50,000个并发连接数。

  • 反向代理
  • 负载均衡
  • 动静分离
  • 高可用

占内存小,可以实现高并发连接、处理响应快。
可以实现http服务器、虚拟主机、反向代理、负载均衡。
nginx配置简单
可以不暴露真实服务器IP地址

2、反向代理.

正向代理:

Nginx,.不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。,正向代理:如果把局域网外的 Intemet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。-

正向代理:在客户端(浏览器)配置代理服务器,通过代理服务器访问互联网的过程

反向代理:

反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器P地址。

3、负载均衡.

在大量并发访问情况下,传统单机应用存在性能问题,满足不了日常需求,为此我们可以采用 纵向扩展(升级配置)和横向扩展(廉价集群)的方式高并发问题。但是仅增加升级配置(即使是顶级配置)也无法满足我们日益增长的需求,为此使用横向扩展更加符合实际情况。

单个服务器无法承载高并发量,如果我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,该过程:负载均衡

4、动静分离.

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。

Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种,

  • 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
  • 另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。·

通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires来缓存〉,我这里设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码 200。,

第一种

5、高可用.

  • 需要两台或以上nginx服务器(两台linux设备)
  • 需要keepalived
  • 需要一个虚拟ip

二、nginx安装.

1、下载.

下载地址:https://nginx.org/en/download.html

下载稳定版即可

安装之前需要的依赖:

  • pcre
  • openssl
  • zlib

2、安装步骤.

①使用xftp6上传 nginx压缩包到linux设备上.

存放在/app目录下

②安装步骤.

# 进入安装目录
cd /usr/local
mkdir nginx
cd nginx

# 安装依赖
yum -y install gcc gcc-c++ make libtool
yum -y install zlib zlib-devel pcre-devel openssl openssl-devel

# 解压
tar -zxvf /app/nginx-1.18.0.tar.gz -C /usr/local/nginx

# 安装
cd /usr/local/nginx/nginx-1.18.0
./configure
make && make install

# 启动
cd /usr/local/nginx/sbin
./nginx

# 查看启动情况
ps -ef | grep nginx
    # 启动了两个进程
    root nginx: master process ./nginx
    nobody nginx: worker process

③访问nginx.

如果有防火墙,需要开放80端口,https://blog.csdn.net/luchenh/article/details/106329236

浏览器地址栏:linux设备ip地址:80(或 linux设备ip地址),如 192.168.188.199:80

三、配置文件.

打开配置文件:

cd /usr/local/nginx/conf
vim nginx.conf

文件内容解析:.

nginx配置文件由三部分组成:

  • nginx全局块

    • 从配置文件开始到events块之间内容:用于设置影响nginx服务器运行的配置指令
      • nginx的用户及用户组
      • 允许生成的worker process数
      • 进程PID存放路径、日志存放路径
  • events块

    • events大括号包含的内容:用于设置niginx服务器与用户的网络连接
      • worker_connections 1024;支持最大的连接数
  • http块(反向代理、动静分离、负载均衡、高可用)

    • http块中可以有多个server块

    • http全局块

      • 文件引入
      • MIME-TYPE定义
      • 日志自定义
      • 连接超时时间
      • 单链接请求上限
    • server块(虚拟主机)

      • server块中可以有多个location块

      • server全局块

      • location块

        • location详解:https://www.cnblogs.com/cangqinglang/p/9173565.html

          location [ = | ~ | ~* | ^~ ] uri {}
          # 1、=: 用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
          # 2、~: 用于表示 uri包含正则表达式,并且区分大小写。
          # 3、~*: 用于表示uri包含证则表达式,并且不区分大小写。
          # 4、^~: 用于不含正则表达式的uri前,要求 Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此 location 处理请求,而不再使用location块中的正则uri和请求字符串做匹配。
          
          注意:如果uri包含正则表达式,则必须要有~或者~*标识。.

原始完整nginx.conf:

#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.conf中文详解:

以下内容来自:https://www.cnblogs.com/paulwhw/articles/11116363.html

######Nginx配置文件nginx.conf中文详解#####

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

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

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

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

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


events
{
    #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型
    #是Linux 2.6以上版本内核中的高性能网络I/O模型,linux建议epoll,如果跑在FreeBSD上面,就用kqueue模型。
    #补充说明:
    #与apache相类,nginx针对不同的操作系统,有不同的事件模型
    #A)标准事件模型
    #Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll
    #B)高效事件模型
    #Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
    #Epoll:使用于Linux内核2.6版本及以后的系统。
    #/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
    #Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。
    use epoll;

    #单个进程最大连接数(最大连接数=连接数*进程数)
    #根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。
    worker_connections 65535;

    #keepalive超时时间。
    keepalive_timeout 60;

    #客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。
    #分页大小可以用命令getconf PAGESIZE 取得。
    #[root@web001 ~]# getconf PAGESIZE
    #4096
    #但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数。
    client_header_buffer_size 4k;

    #这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。
    open_file_cache max=65535 inactive=60s;

    #这个是指多长时间检查一次缓存的有效信息。
    #语法:open_file_cache_valid time 默认值:open_file_cache_valid 60 使用字段:http, server, location 这个指令指定了何时需要检查open_file_cache中缓存项目的有效信息.
    open_file_cache_valid 80s;

    #open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。
    #语法:open_file_cache_min_uses number 默认值:open_file_cache_min_uses 1 使用字段:http, server, location  这个指令指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,如果使用更大的值,文件描述符在cache中总是打开状态.
    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;
}



#设定http服务器,利用它的反向代理功能提供负载均衡支持
http
{
    #文件扩展名与文件类型映射表
    include mime.types;

    #默认文件类型
    default_type application/octet-stream;

    #默认编码
    #charset utf-8;

    #服务器名字的hash表大小
    #保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因此,如果Nginx给出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.
    server_names_hash_bucket_size 128;

    #客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。
    client_header_buffer_size 32k;

    #客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取。
    large_client_header_buffers 4 64k;

    #设定通过nginx上传文件的大小
    client_max_body_size 8m;

    #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
    #sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
    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 jh.w3cschool.cn {

        #upstream的负载均衡,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;

        #nginx的upstream目前支持4种方式的分配
        #1、轮询(默认)
        #每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
        #2、weight
        #指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
        #例如:
        #upstream bakend {
        #    server 192.168.0.14 weight=10;
        #    server 192.168.0.15 weight=10;
        #}
        #2、ip_hash
        #每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
        #例如:
        #upstream bakend {
        #    ip_hash;
        #    server 192.168.0.14:88;
        #    server 192.168.0.15:80;
        #}
        #3、fair(第三方)
        #按后端服务器的响应时间来分配请求,响应时间短的优先分配。
        #upstream backend {
        #    server server1;
        #    server server2;
        #    fair;
        #}
        #4、url_hash(第三方)
        #按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
        #例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
        #upstream backend {
        #    server squid1:3128;
        #    server squid2:3128;
        #    hash $request_uri;
        #    hash_method crc32;
        #}

        #tips:
        #upstream bakend
        #在需要使用负载均衡的server中增加 proxy_pass http://bakend/;

        #每个设备的状态设置为:
        #1.down表示单前的server暂时不参与负载
        #2.weight为weight越大,负载的权重就越大。
        #3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
        #4.fail_timeout:max_fails次失败后,暂停的时间。
        #5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

        #nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
        #client_body_in_file_only设置为On 可以讲client post过来的数据记录到文件中用来做debug
        #client_body_temp_path设置记录文件的目录 可以设置最多3层目录
        #location对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡
    }



    #虚拟主机的配置
    server
    {
        #监听端口
        listen 80;

        #域名可以有多个,用空格隔开
        server_name www.w3cschool.cn w3cschool.cn;
        index index.html index.htm index.php;
        root /data/www/w3cschool;

        #对******进行负载均衡
        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;

        #对 "/" 启用反向代理
        location / {
            proxy_pass http://127.0.0.1:88;
            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;
        }


        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file confpasswd;
            #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
        }

        #本地动静分离反向代理配置
        #所有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直接读取不经过tomcat或resin
        location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|
        pdf|xls|mp3|wma)$
        {
            expires 15d; 
        }

        location ~ .*.(js|css)?$
        {
            expires 1h;
        }
    }
}
######Nginx配置文件nginx.conf中文详解#####

四、常用命令.

# 进入nginx可执行文件目录
cd /usr/local/nginx/sbin

# 1.查看nginx版本
./nginx -v
    nginx version: nginx/1.18.0

# 2.启动nginx
./nginx

# 3.停止nginx
./nginx -s stop

# 4.重新加载nginx(修改配置文件后使用)
./nginx -s reload

五、Nginx的配置.

1、反向代理-1.

①实现效果解释:.

通过nginx访问到 tomcat服务

打开浏览器,地址栏输入 www.123.com ,跳转到linux设备上tomcat主页

前提安装tomcat服务器,并启动tomcat,如果有防火墙需要开放8080端口

安装教程:https://blog.csdn.net/qq_40618664/article/details/94875995

开放端口:https://blog.csdn.net/luchenh/article/details/106329236

访问tomcat服务

②配置步骤.

(1)在window的hosts文件中,添加.

C:\Windows\System32\drivers\etc\hosts

修改hosts需要管理员权限

# nginx所在linux设备的ip地址(根据实际的修改)  域名,如下
192.168.17.129 www.123.com
(2)配置nginx.conf(server块的location块中).
proxy_pass http://127.0.0.1:8080;

保存,重加载nginx

(3)访问.

2、反向代理-2.

①实现效果解释:.

通过不同路径,访问到不同应用

访问:http://www.123.com/tomcat8 跳转到 www.123.com:8080/tomcat8,访问到tomcat8界面;

访问:http://www.123.com/tomcat9 跳转到 www.123.com:8081/tomcat9,访问到tomcat8界面;

前提:再安装一个版本为9的tomcat服务器,更改端口为8081,并启动服务

tomcat8

tomcat9

②配置步骤.

(1)复制webapps下 ROOT目录==> tomcat8/9 (两个安装目录).

(2)配置nginx.conf(server块的location块中).
location ~ /tomcat8/ {
    proxy_pass http://127.0.0.1:8080; # 访问www.123.com/tomcat8/ => www.123.com:8080/tomcat8/
}

location ~ /tomcat9/ {
    proxy_pass http://127.0.0.1:8081; # 访问www.123.com/tomcat9/ => www.123.com:8080/tomcat9/
}

重启服务nginx

③访问liuyou/tomcat8/和liuyou/tomcat9/.

因为服务器没有备案,所以www.123.com被禁用了,以下使用liuyou代替

3、负载均衡.

①实现效果解释:.

多次请求http://www.123.com/nginx,这些平均请求分担到8080和8081上的两台服务器上

②配置步骤.

配置nginx.conf.
upstream myserver{
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}
location / {
    root   html;
    proxy_pass http://myserver; # /下的请求会 平均分发到8080和8081
    index  index.html index.htm;
}

重加载nginx

③访问liuyou/.

第一次:

第二次:

分配策略:.

1、轮询(默认).

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight.

weight 代表权重,默认为1,权重越高被分配的客户端越多。
指定轮询几率,weight和访间比率成正比,用于后端服务器性能不均的情况。例如,

upstream myserver{
    server 127.0.0.1:8080 weight=1;
    server 127.0.0.1:8081 weight=10;
}
3、ip_hash.

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决 session的问题。例如:

upstream myserver{
    ip_hash;
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}
4、fair(第三方).

按后端服务器的响应时间分配请求,响应时间短的优先分配。

upstream myserver{
    fair;
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}

4、动静分离.

①实现效果解释:.

通过liuyou/img/.png访问到图片(使用nginx)

②配置步骤.

(1)准备工作:.

在/下创建data/img目录,并将 本地图片 上传到该目录下

cd /
mkdir -p /data/img

# 使用 xftp上传图片到该目录
[root@liuyou img]# ll
total 60
-rw-r--r-- 1 root root 57381 Dec 13 17:19 饼图.gif
(2)配置nginx.conf(server块的location块中).

③访问liuyou/img/ 和 liuyou/img/饼图.gif.

5、高可用.

.

.

(1)准备工作.
两台服务器.
  • 主:hadoop:192.168.111.10
  • 备:hadoop1:192.168.111.20
两台服务器 都已安装tomcat服务器.
  • hadoop:tomcat8
  • hadoop1:tomcat9
两台服务器都 安装配置了nginx.

nginx.conf内容如下:

两台服务器 安装了keepalived.
# 安装keepalived
yum install keepalived -y
# 查看安装情况 安装位置在: /etc/keepalived
rpm -qa keepalived

# 打开配置文件
vim /etc/keepalived/keepalived.conf
虚拟ip.
  • 192.168.111.100
两台服务器状态:.
  • tomcat已开启
  • nginx已开启
(2)配置(keepalived.conf).

vim /etc/keepalived/keepalived.conf

注意:需要注释 vrrp_strict,不然会出现ping不通VIP的情况

主机(hadoop)配置文件内容更改为:.
! Configuration File for keepalived

## 全局配置
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.111.10
   smtp_connect_timeout 30
   router_id LVS_DEVEL        # 标识本节点的字符串,通常为 hostname,也可以是本机ip
   vrrp_skip_check_adv_addr
   # vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance 的优先级
vrrp_script chk_http_port {
    script "/usr/local/src/nginx_check.sh" # 检测 nginx 状态的脚本路径
    interval 2    # 检测脚本执行的间隔
    weight -20    # 如果条件成立,权重-20
}

## 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
    state MASTER # 主节点为 MASTER, 对应的备份节点为 BACKUP
    interface ens33 # 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同
    virtual_router_id 51 # 虚拟路由的 ID 号, 两个节点设置必须一样, 可选 IP 最后一段使用, 相同的 VRID 为一个组,他将决定多播的 MAC 地址
    priority 100 #节点优先级, 值范围 0-254, MASTER 要比 BACKUP 高
    advert_int 1 # 组播信息发送间隔,两个节点设置必须一样, 默认 1s
    authentication { # 设置验证信息,两个节点必须一致
        auth_type PASS
        auth_pass 1111  # 真实生产,按需求对应该过来
    }
    virtual _ipaddress {
        192.168.111.100 # 虚拟 ip,可以定义多个
    }

    track_script {
        chk_http_port # 追踪脚本,和上面的脚本名一致
    }
}
备机(hadoop1)配置文件内容更改为:.

相较于主机更改了‘state(BACKUP)、priority(80)、route_id(192.168.111.20)

! Configuration File for keepalived

## 全局配置
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.111.20
   smtp_connect_timeout 30
   router_id LVS_DEVEL        # 标识本节点的字符串,通常为 hostname,也可以是本机ip
   vrrp_skip_check_adv_addr
   # vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance 的优先级
vrrp_script chk_http_port {
    script "/usr/local/src/nginx_check.sh" # 检测 nginx 状态的脚本路径
    interval 2    # 检测脚本执行的间隔
    weight -20    # 如果条件成立,权重-20
}

## 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
    state BACKUP # 主节点为 MASTER, 对应的备份节点为 BACKUP
    interface ens33 # 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同
    virtual_router_id 51 # 虚拟路由的 ID 号, 两个节点设置必须一样, 可选 IP 最后一段使用, 相同的 VRID 为一个组,他将决定多播的 MAC 地址
    priority 80 #节点优先级, 值范围 0-254, MASTER 要比 BACKUP 高
    advert_int 1 # 组播信息发送间隔,两个节点设置必须一样, 默认 1s
    authentication { # 设置验证信息,两个节点必须一致
        auth_type PASS
        auth_pass 1111  # 真实生产,按需求对应该过来
    }
    virtual _ipaddress {
        192.168.111.100 # 虚拟 ip,可以定义多个
    }

    track_script {
        chk_http_port # 追踪脚本,和上面的脚本名一致
    }
}
创建脚本文件(nginx_check.sh).

其存放路径为 /usr/local/src/nginx_check.sh,两台服务器都需要配置

更改器文件权限:chmod 744 /usr/local/src/nginx_check.sh

解读脚本,定义变量,此变量为检查nginx进程脚本,如果进程为0,则启动nginx服务,再次检查nginx服务,如果仍没启动 ,杀掉所有keepalived的进程。

#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ]; then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

③启动服务.

两台服务器 启动服务

# 启动 tomcat 服务 进入tomcat安装目录下bin
./startup.sh
# 查看服务启动情况
ps -ef | grep tomcat

# 启动 nginx 服务 进入nginx安装目录下sbin
# 若已启动,使用 ./nginx -s reload 
./nginx
# 查看服务启动情况
ps -ef | grep nginx

# 启动 keepalived 服务
systemctl start keepalived
# 查看服务启动情况
ps -ef | grep keepalived

④测试.

浏览器地址栏访问 虚拟ip http://192.168.111.100/

可以正常访问到页面

主机可以查看到已绑定VIP

ip a

如果主服务器的keepalived停止服务,从服务器会自动接管VIP对外服务;一旦主服务器的keepalived恢复,会重新接管VIP

验证(过程不做演示):.

(1)先后在主、从服务器上启动keepalived;
(2)在主服务器上查看是否已经绑定了虚拟IP: ip addr;
(3)停止主服务器上的keepalived,然后在从服务器上查看是否已经绑定了虚拟IP:
(4)启动主服务器上的keepalived,看看主服务器能否重新接管虚拟IP。

但这我们需要的是当NginX停止服务的时候能够自动切换。
keepalived支持配置监控脚本,我们可以通过脚本监控Nginx的状态,如果状态不正常则进行一系列的操作,最终仍不能恢复Nginx则杀掉keepalived,使得从服务器能够接管服务。

这个脚本就是 之前配置的脚本 nginx_check.sh,当nginx死掉,会重启该nginx或vip绑定其他nginx

六、执行原理.

master 和 worker.

下面默认nginx启动是一个master和一个worker

worker可以有多个

  • master :管理worker
  • worker

master接收到用户的请求,它把请求给其下的worker,worker通过争抢的方式获取请求;获取请求的worker通过反向代理转发请求

采用master-worker的好处.

1、利于 nginx -s reload进行热部署.

当项目部署后,nginx接收到用户请求,其中一个worker处理请求;当我们此时使用重加载,之前的worker继续处理请求,其他worker进行重加载。

首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有 bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

worker的个数?.

Nginx同Redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,异步非阻塞的方式来处理请求,即使是成千上万个请求也不在话下。每个worker的线程可以把一个cpu的性能发挥极致。所以worker数和服务器的cpu数相等时最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗。

worker的连接数.

1、发送一个请求,占用了worker的几个连接数?.

2或4个

# 2个
如果请求的是静态资源
client ==> worker
worker ==> client

# 4个
如果请求的是动态资源
client ==> worker ==> tomcat
tomcat ==> worker ==> client

2、假如有4个worker,每个worker连接数为1024,那么能够接受的并发量是多少.

最多2048 最少1024

# worker支持的最大连接数
# worker数 * worker连接数 = 最大连接数
4 * 1024 = 4096

# 并发量 2048 如果所有请求都是静态资源
4096 / 2 = 2048

# 并发量 1024 如果所有请求都是动态资源
4096 / 4 = 1024

文章作者: liuminkai
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liuminkai !
评论
 上一篇
linux开放防火墙端口 linux开放防火墙端口
https://blog.csdn.net/luchenh/article/details/106329236 https://www.jianshu.com/p/dc49ed9fbfcf linux开放防火墙端口.查看防火墙服务状态: #
2020-12-13
下一篇 
elementUI实战应用 elementUI实战应用
官网:https://element.eleme.cn/ element ui 就是基于Vue的一个ui框架,该框架基于vue开发了很多相关组件,方便我们快速开发页面 实战软件:WebStorm 一、安装ElementUI.1、安装vu
2020-12-10
  目录