Nginx学习笔记

Nginx

一、nginx基本概念

1. 什么是nginx

Nginx(" engine x")是一个高性能的mrP和反向代理服务器,特点是占有内存少,并发能
力强,事实上 nginx的并发能力确实在同类型的网页服务器中表现较好
Nginx专为性能优化而开发,性能是其最重要的考量实现上非常注重效率,能经受高负载
的考验,有报告表明能支持高达'50000'个并发连接数。

2.反向代理

  • 正向代理
正向代理:如果把局域网外的 Internet想象成一个巨大的资源库,则局域网中的客户端要访
可 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理
  • 反向代理
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只
需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返
回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器
地址,隐藏了真实服务器IP地址。

3.负载均衡

单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先
请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服
务器,也就是我们所说的负载均衡

4.动静分离

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

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

1.下载nginx

​ 官网: http://nginx.org/ 下载nginx-1.12.2.tar.gz等安装包

2. 安装nginx

  • 安装pcre依赖
#进入usr/src目录下(也可以是别的目录)
cd usr/local/src/ 
#下载pcre包
wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
#解压缩
tar -xvf pcre-8.37.tar.gz
#进入解压目录
cd pcre-8.37/
#执行./configure编译
./configure
#用make && make install 进行安装
make && make install
#查看版本号验证是否安装成功
pcre-config --version
  • 安装OpenSSL、zlib、gcc依赖
yum -y install make zlib zlib-devel gcc-C++ libtool openssl openssI-devel
  • 安装nginx
#进入usr/src目录下(也可以是别的目录)
cd /usr/local/src/ 
#下载pcre包
wget http://nginx.org/download/nginx-1.12.2.tar.gz
#解压缩
tar -xvf nginx-1.12.2.tar.gz
#进入解压目录
cd nginx-1.12.2/
#执行./configure编译
./configure
#用make && make install 进行安装
make && make install
#进入执行目录
cd /usr/local/nginx/sbin
#启动nginx
./nginx
  • 注意,如果出现启动失败
./nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
  • 尝试使用如下方式解决
##查看libpcre.so文件位置
find / -type f -name *libpcre.so.*
#出现如下内容
/lib64/libpcre.so.0.0.1
/usr/local/lib/libpcre.so.1.2.5
/usr/src/pcre-8.37/.libs/libpcre.so.1.2.5

#建立软链接,给libpcre.so.0.0.1建立一个叫libpcre.so.1的链接文件
ln -s /lib64/libpcre.so.0.0.1 /lib64/libpcre.so.1
  • 这样,就可以启动了
#再次启动nginx
./nginx
#查看nginx进程
ps -ef | grep nginx

#看到如下内容说明启动成功
root      13326      1  0 18:32 ?        00:00:00 nginx: master process ./nginx
nobody    13327  13326  0 18:32 ?        00:00:00 nginx: worker process
root      13330   3349  0 18:32 pts/1    00:00:00 grep nginx

3. 测试访问

​ windows如果要访问虚拟机的nginx,需要先关闭linux的防火墙。

  • 如果是CentOS 7,使用如下方法
# 查看开放的端口号
firewall-cmd --list-all
# 设置开放的端口号
firewall-cmd --add-service=http –permanent
firewall-cmd --add-port=80/tcp --permanent
# 重启防火墙
firewall-cmd –-reload
  • 如果是CentOS 6,使用如下方法
## 永久性生效,重启后不会复原
# 开启
chkconfig iptables on
# 关闭
chkconfig iptables off

## 即时生效,重启后复原
# 开启
service iptables start
# 关闭
service iptables stop
  • 之后通过ifconfig查询linux的IP地址,在浏览器中访问(默认端口是80端口),简单下图说明访问成功

4. nginx常用命令

# 首先需要进入nginx目录(使用nginx命令的前提)
cd /usr/local/nginx/sbin/

# 1.查看版本号
./nginx -v

# 2.启动
./nginx

# 3.停止
./nginx -s stop

# 4.重新加载
./nginx -s reload

5. nginx的配置文件★

  • 配置文件的位置
cd /usr/local/nginx/conf
# 进入该目录可以看到 nginx.conf 这就是nginx的配置文件
  • 配置文件的内容
## nginx配置文件由三部分组成:全局块,events块,http块

#==========这里是全局块==============
#user  nobody;
worker_processes  1;	# worker_processes越大,能承载的并发越多

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


#===========这里是events块============

events {
    worker_connections  1024;	# 每个worker_processes支持的最大连接数为1024
}


#=============这里是http块==============

http {
    
    #==============这里是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块=======================
    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;
    #    }
    #}

}

5.1 全局块

全局块配置一些影响nginx整体运行的指令,主要包括配置运行Nginx服务器的用户(组),允许生成的worker process数,进程pid存放路径,日志存放路径和类型以及配置文件的引入等

5.2 events块

events块涉及的指令主要影响 Nginx服务器与用户的网络连接,常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,毎个work process可以同时支持的最大连接数等。

5.3 http块★

这是配置最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里

  • http全局块

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

  • server块

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

  • 全局 server块

最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。

  • location块

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

5.4 配置文件结构图

6. 样例配置文件

########### 每个指令必须有分号结束。#################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512
}
http {
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    error_page 404 https://www.baidu.com; #错误页
    server {
        keepalive_requests 120; #单连接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
}
6.1 几个常见配置项:
  • remote_addr 与 ​http_x_forwarded_for用以记录客户端的ip地址;
  • remote_user :用来记录客户端用户名称;
  • time_local : 用来记录访问时间与时区;
  • request : 用来记录请求的url与http协议;
  • status : 用来记录请求状态;成功是200;
  • body_bytes_s ent :记录发送给客户端文件主体内容大小;
  • http_referer :用来记录从那个页面链接访问过来的;
  • http_user_agent :记录客户端浏览器的相关信息;
6.2 惊群现象

一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。

6.3 每个指令必须有分号结束。
6.4 location 指令说明
1、=

​ 用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。

2、~

​ 用于表示uri包含正则表达式,并且区分大小写。

3、~*

​ 用于表示uri包含正则表过式,并且不区分大小写。

4、^~

​ 用于不含正则表达式的uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的1ocation后,立即使用此1ocation处理请求,而不再使用 location块中的正则uri和请求字符串做匹配

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

location [= | ~ | ~* | ^~] uri {
    
}

6.5 nginx负载均衡分配服务器策略
轮询(默认)

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

weight

​ weight代表权重默认为1权重越高被分配的客户端越多

ip hash

​ 每个请求按访问i的hash结果分配,这样每个访客固定访问一个后端服务器

fair(第三方)

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

http{
    
    # 负载均衡的服务列表
    upstream myserver{
        ip_hash;	# (选填)每个客户端固定访问一个服务器,统一session
        server 192.168.137.128:8080 weight=1;# (选填)weight代表权重,默认为1,权重越高被分配的客户端越多
        server 192.168.137.128:8180 weight=1;
        fair;	#(选填)根据响应时间分配,响应时间短优先分配
    }
    
    server{
        location / {
            proxy_pass http://myserver;		# 配置的是负载均衡服务列表的名字
            proxy_connect_timeout 10;
        }
        
    }
}
6.6 location中的expires配置

​ expires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求
要配置expires,可以在http段中或者server段中或者location段中加入

       location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
           root /var/www/img/;
           expires 30d;
       }

​ 控制图片等过期时间为30天,当然这个时间可以设置的更长。具体视情况而定
​ 比如

       location ~ \.(wma|wmv|asf|mp3|mmf|zip|rar|swf|flv)$ {
               root /var/www/upload/;
               expires max;
       }

​ expires 指令可以控制 HTTP 应答中的ExpiresCache-Control的头标(起到控制页面缓存的作用)

语法:

  • expires [time|epoch|max|pff]
    默认值:off
    expires指令控制HTTP应答中的ExpiresCache-Control的头部(Header)信息,启动控制页面缓存的作用
    time:可以使用正数或负数。Expires头标的值将通过当前系统时间加上设定time值来设定。time值还控制Cache-Control的值,负数表示no-cache;正数或零表示max-age=time

    epoch:指定Expires的值为 1 January,1970,00:00:01 GMT
    max:指定Expires的值为31 December2037 23:59:59GMT,Cache-Control的值为10年。-1:指定Expires的值为当前服务器时间-1s,即永远过期。
    off:不修改ExpiresCache-Control的值

expires使用了特定的时间,并且要求服务器和客户端的时钟严格同步。
Cache-Control是用max-age指令指定组件被缓存多久。
对于不支持http1.1的浏览器,还是需要expires来控制。所以最好能指定两个响应头。但HTTP规范规定max-age指令将重写expires头。

三、 nginx配置实例1-反向代理

1. 实例目标

  1. 通过在浏览器输入域名访问测试服务器中的tomcat服务器
  2. 通过在浏览器访问不同的地址直接跳转到对应端口的服务中

2. 配置准备

  • 安装java环境
# 下载jdk的tar包考到服务器中
cd /usr/local/
# 解压
tar -zxvf jdk-8u231-linux-x64.tar.gz
# 配置环境变量
vim /etc/profile
# 文件末位追加以下内容
#============↓以下内容↓===============
#set java environment
JAVA_HOME=/usr/local/jdk1.8.0_231
JRE_HOME=/usr/local/jdk1.8.0_231/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
#=============↑以上内容↑================
# 使文件立即生效
source /etc/profile
# 验证配置
java -version
  • 安装tomcat(目标2需要安装2个tomcat,配置为两个不同端口,此处省略)
# 进入local目录
cd /usr/local/
# 下载tomcat压缩包
wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.99/bin/apache-tomcat-7.0.99.tar.gz
# 解压
tar -zxvf apache-tomcat-7.0.99.tar.gz

# 进入tomcat的conf目录下:
cd /usr/local/tomcat/apache-tomcat-7.0.99/conf/
# 编辑配置文件 
vim server.xml
# 将 Connector port由默认的8080改为80
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> ......

# 进入tomcat的conf目录下:
cd /usr/local/tomcat/apache-tomcat-7.0.99/bin/
# 启动tomcat
./startup.sh
# 关闭tomcat
./shutdown.sh
  • DNS解析

    如果有云解析服务,可以在对应的云解析服务页面(如腾讯云)中配置服务器的ip

    如果没有云解析服务,可以通过修改本地 C:\Windows\System32\drivers\etc\hosts的hosts文件来实现域名DNS解析

    192.168.137.128 dev.helin9s.cn
    
  • 配置Nginx1

# 编辑配置文件
vim /usr/local/nginx/conf/nginx.conf

# 修改配置
server {
        listen       80;
        server_name  192.168.137.128;	# 此处改为服务器ip

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            proxy_pass	http://127.0.0.1:8080	# 此处设置nginx需要转发的ip和端口
            index  index.html index.htm;
        }

# 修改完成后启动nginx
/usr/local/nginx/sbin/nginx
  • 配置Nginx2
# 修改配置(可以和上面配置同时存在,一个http块可以有多个server块)
server {
        listen       9001;
        server_name  192.168.137.128;	# 此处改为服务器ip

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location ~ /edu/ {			# location后面的配置以正则表达式的方式进行匹配
            proxy_pass	http://127.0.0.1:8080	# 此处设置nginx需要转发的ip和端口
        }
    
    	location ~ /vod/ {
            proxy_pass	http://127.0.0.1:8081	# 此处设置nginx需要转发的ip和端口
        }

3. 访问测试

​ 注意:测试前保证服务器端口开放,如果没有开放,可以开放该端口或者关闭防火墙

​ 如果通过浏览器输入http://dev.helin9s.cn/成功访问服务器上的tomcat,说明实例1目标1成功。

​ 如果通过浏览器输入http://dev.helin9s.cn:9001/edu/http://dev.helin9s.cn:9001/vod/能访问到不同的tomcat则说明实例1目标2成功。

四、nginx配置实例2-负载均衡

1. 实例目标

浏览器访问服务器平均分配到两台不同的tomcat服务器中

2. 配置准备

  • 准备两个tomcat,并配置为不同的端口(同上)

  • 配置nginx

http{
    
    # 负载均衡的服务列表
    upstream myserver{
        ip_hash;	# (选填)每个客户端固定访问一个服务器,统一session
        server 192.168.137.128:8080 weight=1;# (选填)weight代表权重,默认为1,权重越高被分配的客户端越多
        server 192.168.137.128:8180 weight=1;
        fair;	#(选填)根据响应时间分配,响应时间短优先分配
    }
    
    server{
        location / {
            proxy_pass http://myserver;		# 配置的是负载均衡服务列表的名字
            proxy_connect_timeout 10;
        }
        
    }
}

3.访问测试

​ 如果通过浏览器访问服务器同一个地址能平均访问到两台不同的服务器则说明实例2目标成功。

五、 nginx配置实例3-动静分离

1. 实例目标

通过浏览器访问服务器静态资源

2. 配置准备

  • 准备一些静态资源
  • 配置nginx
server {
        listen       80;
        server_name  192.168.137.128;	# 此处改为服务器ip

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location /www/ {
            root /data/;	# 配置静态资源根目录
            index  index.html index.htm;
        }

    	location /image/ {
            root /data/;
            autoindex on;
        }

3. 访问测试

​ 浏览器输入http://dev.helin9s.cn/image/01.jpg能访问到图片(/image/01.jpg 是预先准备的静态资源)说明实例3目标成功。

六、 nginx配置高可用集群

1. 实例目标

保证在一台nginx服务器宕机后能自动切换到另一台nginx服务器上

2. 配置准备

  • 准备两台服务器,分别都安装上nginx环境,并且安装上keepalived
# 安装keepalived
yum install keepalived –y
  • 修改/etc/hosts的hosts文件
vim `/etc/hosts`
# 给文件增加
127.0.0.1 LVS_DEVEL		# 这个是keepalivec.conf中的router_id
  • 安装之后,在 etc 里面生成目录 keepalived,有文件 keepalived.conf配置主服务器
# 修改/etc/keepalived/keepalivec.conf配置文件
global_defs {		# 全局定义
    notification_email {
        acassen@firewall.loc
        failover@firewall.loc
        sysadmin@firewall.loc
    }
    notification_email_from Alexandre.Cassen@firewall.loc
    smtp_server 192.168.17.129
    smtp_connect_timeout 30
    router_id LVS_DEVEL		# 路由id(/etc/hosts)
}
vrrp_script chk_http_port {		# 检测脚本和权重参数
    script "/usr/local/src/nginx_check.sh"		# 检测脚本的路径
    interval 2 	#(检测脚本执行的间隔(单位秒))
    weight 2	# 设置服务器权重(如果主机宕机,则权重降为2)
}
vrrp_instance VI_1 {		# 虚拟ip的配置
    state MASTER # 备份服务器上将 MASTER 改为 BACKUP
    interface ens33 	# 网卡(ifconfig中获取)
    virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
    priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1	# 心跳检测,1秒检测一次
    authentication {	# 权限校验方式
        auth_type PASS	# 密码方式校验
        auth_pass 1111	# 密码1111
    }
    virtual_ipaddress {		# 虚拟ip地址
    	192.168.17.50 	# VRRP H 虚拟地址(可以绑定多个ip)
    }
}
  • 配置备机
# 修改/etc/keepalived/keepalivec.conf配置文件
global_defs {		# 全局定义
    notification_email {
        acassen@firewall.loc
        failover@firewall.loc
        sysadmin@firewall.loc
    }
    notification_email_from Alexandre.Cassen@firewall.loc
    smtp_server 192.168.17.129
    smtp_connect_timeout 30
    router_id LVS_DEVEL		# 路由id(/etc/hosts)
}
vrrp_script chk_http_port {		# 检测脚本和权重参数
    script "/usr/local/src/nginx_check.sh"		# 检测脚本的路径
    interval 2 	#(检测脚本执行的间隔(单位秒))
    weight 2	# 设置服务器权重(如果主机宕机,则权重降为2)
}
vrrp_instance VI_1 {		# 虚拟ip的配置
    state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
    interface ens33 	# 网卡(ifconfig中获取)
    virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
    priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1	# 心跳检测,1秒检测一次
    authentication {	# 权限校验方式
        auth_type PASS	# 密码方式校验
        auth_pass 1111	# 密码1111
    }
    virtual_ipaddress {		# 虚拟ip地址
    	192.168.17.50 	# VRRP H 虚拟地址
    }
}
  • /usr/local/src添加检测脚本nginx_check.sh(主备机都需要)
# 检测nginx是否还活着,如果宕机则切换到备机
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx		# nginx启动路径
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
    	killall keepalived
    fi
fi

3. 访问测试

​ 启动两台服务器的nginxkeepalived

# 启动 nginx: 
./nginx
# 启动 keepalived: 
systemctl start keepalived.service

​ 主服务器宕机后,通过192.168.17.50是否能正常访问服务器。如果能正常访问,则实例目标成功。

七、nginx原理

master & worker

master-workers 的机制的好处

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

需要设置多少个 worker

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

# 设置 worker 数量
worker_processes 4
#work 绑定 cpu(4 work 绑定 4cpu)。
worker_cpu_affinity 0001 0010 0100 1000
#work 绑定 cpu (4 work 绑定 8cpu 中的 4 个) 。
worker_cpu_affinity 0000001 00000010 00000100 00001000

连接数 worker_connection

这个值是表示每个 worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接
数,应该是 worker_connections * worker_processes。当然,这里说的是最大连接数,对于
HTTP 请 求 本 地 资 源 来 说 , 能 够 支 持 的 最 大 并 发 数 量 是 worker_connections *
worker_processes,如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访
问最大并发数是: worker_connections * worker_processes /2,而如果是 HTTP 作 为反向代
理来说,最大并发数量应该是 worker_connections * worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值