发布于 

nginx相关笔记

nginx基本概念

nginx简介:nginx是一个高性能的HTTP和反向代理Web服务器,占有内存少,并发能力强,nginx专为性能优化而开发,非常的注重效率,能够经受高负载的考验,有报告表明nginx最高可以支持50000个并发连接数。

反向代理:

  • 正向代理:在我们的客户端配置代理服务器进行互联网的访问就是正向代理,客户端需要进行正向代理配置,对代理是有感知的。
  • 反向代理:客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器选择处理请求的目标服务器,获取结果后最终将结果返回给客户端,此过程对外暴露的是反向代理服务器的端口号。

负载均衡:在高并发且业务比较复杂时,通常一个服务器是无法满足对客户端多个请求的流畅处理,这种情况下,我们可以提高这台服务器的配置,比如内存,CPU等等配置从而解决问题,但也有些时候,单单靠这种方式是无法从根本上解决问题的,第二种解决办法是我们增加服务器的数量,然后将客户端的请求通过中间的反向代理服务器分发到不同的服务器上执行。而负载均衡就是反向代理服务器根据不同服务器的不同性能对客户端发送的多个请求均衡的分发处理。

动静分离:为了加快网站的解析速度,可以把动态请求和静态请求进行分开部署到不同的服务器,降低单个服务器的压力,可以理解为使用nginx处理静态页面,而Tomcat处理动态页面;动静分离目前实现角度大致分为两种:一种是纯粹把静态文件独立成单独的域名,放在单独的服务器上,也是目前主流推崇的方案;另一种是动态和静态文件混合在一起发布,通过nginx来分开。

nginx安装、常用命令和配置文件

nginx安装

1.安装nginx需要提前安装nginx相关的依赖pcre,openssl,zlib,然后安装nginx

2.使用nginx命令启动nginx

3.开放80端口firewall-cmd --add-port=80/tcp --permanent重启防火墙firewall-cmd --reload

nginx常用命令

查看nginx版本号nginx -v

启动nginx命令nginx

停止nginx命令nginx -s stop

重新加载nginx命令nginx -s reload

nginx配置文件

1.nginx配置文件由三个部分组成,第一部分为全局块,第二部分为events

全局块:从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行nginx服务器的用户(组),允许生成的worker process数,进程PID的存放路径,日志存放路径和类型以及配置文件的引入,比如非常常见的一行配置为

1
2
3
4
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

这是nginx服务器并发处理服务的关键配置,worker_processes的值越大,可以支持的并发处理量也越多,但是会收到硬件,软件等设备的制约

2.events块:涉及的指令主要影响nginx服务器与网络用户的网络连接部分,比如worker_connections表示每个worker_processes支持的最大连接数为1024,实际过程中这部分配置对nginx的性能影响较大,在实际中应该灵活配置

1
worker_connections 1024;

3.http块:http块也可以包括http块和server块

  • http全局块:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    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 /var/log/nginx/access.log main;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 4096;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
  • server块:这部分和虚拟机又密切关系

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    server {
    listen 80;
    listen [::]:80;
    server_name _;
    root /usr/share/nginx/html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    error_page 404 /404.html;
    location = /404.html {
    }

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

nginx反向代理

反向代理案例

反向代理案例1:

实现浏览器输入192.168.17.129直接访问到服务器中的tomcat服务,实现步骤:

  • 将nginx配置中的listen设置为80端口(默认情况下也是80端口)然后将server_name修改为本机的ip地址
  • 配置location /中的proxy_pass配置为服务器本机的tomcat服务地址即可
  • 重启nginx nginx -s reload
  • 开放服务器的80端口 firewall-cmd --add-port=80/tcp --permanent
1
2
3
4
5
6
7
8
9
10
server {
#监听80端口
listen 80;
#将server_name设置为本机IP
server_name 192.168.17.129;
location / {
#设置转发到服务器的tomcat运行的端口
proxy_pass http://127.0.0.1:8080;
}
}

反向代理案例2:

实现nginx监听9001端口并且浏览器地址栏输入http://192.168.17.129:9001/tomcat1访问到的是127.0.0.1:8080的tomcat服务,输入http://192.168.17.129:9001/tomcat2访问到的是127.0.0.1:8001的tomcat服务,实现步骤:

  • 准备两个tomcat服务器,让其中一个运行在8080端口,另一个运行在8081端口,在修改tomcat配置文件中的端口号时应该将tomcat所需要的所有端口号都进行修改,否则会出现启动失败的情况,并且在两个tomcat的webapps目录中分别创建tomcat1和tomcat2文件夹,并在文件夹中创建index.html并编辑好内容,两个tomcat服务器的index.html不要相同,不然无法测试成功

  • 配置nginx

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    server{
    #修改监听端口为9001端口
    listen 9001;
    #修改server_name为本机ip
    server_name 192.168.17.129;
    #正则表达式,如果请求路径中包含tomcat1,转发到8080端口
    location ~ /tomcat1/ {
    proxy_pass http://127.0.0.1:8080;
    }
    #正则表达式,如果请求路径中包含tomcat2,转发到8081端口
    location ~ /tomcat2/ {
    proxy_pass http://127.0.0.1:8081;
    }
    }
  • 重启nginx nginx -s reload

  • 开放服务器的9001端口firewall-cmd --add-port=9001/tcp --permanent

location指令说明:

1
2
3
location [ = | ~ | ~* | ^~ ] uri {
#=======content========
}
  • =:用于不包含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并处理该请求

  • ~:用于表示uri包含正则表达式,并且区分大小写

  • ~*:用于表示uri包含正则表达式,并且不区分大小写

  • ^~:用户不含正则表达式的uri前,要求nginx服务器找到表示uri和请求字符串匹配度最高的location后,立即用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配

    *注意:如果uri包含正则表达式,则必须要有或者标识

nginx负载均衡

负载均衡案例:

实现效果:

通过浏览器的地址栏输入地址http://192.168.17.129/tomcat/index.html,实现负载均衡的效果,将请求平均分发到8080端口和8081端口的tomcat服务器

实现步骤:

  • 准备两个tomcat服务器,一个运行在8080端口,一个运行在8081端口,在两个tomcat服务器的webapps目录中,都创建命名为tomcat的文件夹,且在文件夹内创建index.html文件并输入测试内容,测试内容不要相同,否则不容易区分处理改请求的服务器

  • 在nginx配置文件中进行负载均衡相关的配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    http{
    #设置负载均衡的服务器列表
    upstream myserver{
    server 192.168.17.129:8080;
    server 192.168.17.129:8081;
    }

    server{
    #监听80端口
    listen 80;
    #设置服务器名称为IP
    server_name 192.168.17.129;

    location / {
    #设置转发到定义的负载均衡服务器列表名称
    proxy_pass http://myserver;
    }
    }
    }
  • 重启nginx nginx -s reload

  • 开放服务器的80端口 firewall-cmd --add-port=80/tcp --permanent

负载均衡策略

nginx提供的几种负载均衡分配方式(策略)

轮询(默认)

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

可使用的参数:

参数 作用
fail_timeout 与max_fails结合使用。
max_fails 设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被任务是停机了。
fail_time 服务器会被认为停机的时间长度,默认为10s。
backup 标记该服务器为备用服务器,当主服务器停止时,请求会被发送到它这里。
down 标记服务器永久停机

注意:

  • 在轮询中,如果一个服务器down掉了,会自动剔除该服务器
  • 此策略适合服务器配置相当,无状态且短平快的服务使用
weight

weight代表权重,在轮询策略的基础上指定轮询的几率;默认为1,权重越高,被分配的客户端越多,例子如下:

1
2
3
4
upstream myserver{
server 192.168.17.129:8080 weight=2;
server 192.168.17.129:8081;
}

注意:

  • 权重越高分到需要处理的请求就越多
  • 此策略可以和least_coon和ip_hash结合使用
  • 此策略比较适合服务器的硬件配置差别比较大的情况
least_coon

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使他们的负载大致相同,但是,有些请求占用的时间比较长,会导致其所在的后端负载较高。这种情况下,least_coon这种方式就可以达到更好的负载均衡效果。

1
2
3
4
5
upstream myserver {
least_coon;
server 192.168.17.129:8080;
server 192.168.17.129:8081;
}

注意:

  • 此负载均衡方式适合请求处理时间长短不一造成的服务器过载的情况
ip_hash

指定负载均衡按照基于客户端IP的hash值的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以确保session会话。这样每个访客都可以固定的访问一个后端服务器,可以解决session不能跨服务器的问题。

1
2
3
4
5
upstream myserver {
ip_hash;
server 192.168.17.129:8080;
server 192.168.17.129:8081;
}

注意:

  • 在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)
  • ip_hash不能与backup同时使用
  • 此策略适合有服务状态,比如session
  • 当有服务器需要剔除,必须要手动down掉

第三方负载均衡策略

fair

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

1
2
3
4
5
upstream myserver {
server 192.168.17.129:8080;
server 192.168.17.129:8081;
fair;
}
url_hash

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。

1
2
3
4
5
upstream myserver {
hash $request_uri; #实现每个uri定向到同一个后端服务器
server 192.168.17.129:8080;
server 192.168.17.129:8081;
}

nginx动静分离

动静分离案例

通过访问http://192.168.17.129/www/a.html可以访问到服务器中/data/www/a.html文件,通过访问http://192.168.17.129/images/a.png可以访问到/data/images/a.png文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server{
#监听80端口
listen 80;
#设置服务器名称为IP
server_name 192.168.17.129;

location /www/ {
root /data/;
}
location /images/ {
root /data/;
#设置是否可以查看服务器文件夹下面的文件信息
autuindex on;
}
}

nginx配置高可用集群

基本概念

什么是nginx高可用

高可用是分布式系统架构设计过程中必须要考虑的因素之一,通过设计从而减少系统不能提供服务的时间,假如一台nginx服务器宕机了,客户端可以通过另一台nginx服务器进行访问服务

通过nginx+keepalived实现高可用

实现步骤

  • 需要准备两台nginx服务器192.168.17.129和192.168.17.131

  • 两台服务器均安装nginx,并且在两台服务器上安装keepalived

    centos可以直接通过yum命令安装,ubuntu或debian可以直接通过apt-get安装,安装好后可以在**/etc/keepalived/目录下找到keepalived的配置文件keepalived.conf**

    yum install keepalived -y

nginx执行原理




Copyright © 2023 ChenWei | Powered By Stellar
本站已运行 00 小时 00