IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 使用LVS+Keepalived实现Nginx高可用 -> 正文阅读

[系统运维]使用LVS+Keepalived实现Nginx高可用

使用LVS+Keepalived实现Nginx高可用

Nginx介绍和使用

什么是Nginx

  1. Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。

  2. Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。

  3. 可以使静态资源虚拟化,可以缓存服务器静态资源

  4. Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件代理服务器,并在一个BSD-like协议下发行。

  5. 由俄罗斯的程序设计师lgor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler使用。

  6. 其特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表现较好。

  7. Nginx相较于Apache\lighttpd具有占有内存少,稳定性高等优势,并且依靠并发能力强,丰富的模块库以及友好灵活的配置而闻名。

  8. 在Linux操作系统下,Nginx使用epoll事件模型,得益于此,Nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于Epoll的高效事件模型kqueue。

  9. Nginx作为负载均衡服务:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。

  10. 反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。

    参考资料:

    https://zhuanlan.zhihu.com/p/71323442

常见的服务器

  1. MS IIS 微软的,通常发布一些asp.net项目
  2. Weblogic Jboss 用于传统行业 ERP/物流/电信/金融等
  3. Tomcat Jetty 通常用于J2EE项目的
  4. Apache Nginx 用于静态服务虚拟化,反向代理,负载均衡等
  5. Netty 高性能服务器编程框架

什么是正向代理和反向代理

  1. 正向代理:客户端想要访问一个服务器,但是它可能无法直接访问这台服务器,这时候这可找一台可以访问目标服务器的另外一台服务器,而这台服务器就被当做是代理人的角色 ,称之为代理服务器,于是客户端把请求发给代理服务器,由代理服务器获得目标服务器的数据并返回给客户端。客户端是清楚目标服务器的地址的,而目标服务器是不清楚来自客户端,它只知道来自哪个代理服务器,所以正向代理可以屏蔽或隐藏客户端的信息。

  2. 反向代理:从上面的正向代理,你会大概知道代理服务器是为客户端作代理人,它是站在客户端这边的。其实反向代理就是代理服务器为服务器作代理人,站在服务器这边,它就是对外屏蔽了服务器的信息,常用的场景就是多台服务器分布式部署,像一些大的网站,由于访问人数很多,就需要多台服务器来解决人数多的问题,这时这些服务器就由一个反向代理服务器来代理,客户端发来请求,先由反向代理服务器,然后按一定的规则分发到明确的服务器,而客户端不知道是哪台服务器。常常用nginx来作反向代理。

  3. 正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端,反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端
    在这里插入图片描述

    参考资料:

    https://blog.csdn.net/aqleung/article/details/80923470

    https://www.cnblogs.com/taostaryu/p/10547132.html

下载Nginx

  • Nginx官网:http://nginx.org/

  • Nginx下载地址:http://nginx.org/en/download.html
    在这里插入图片描述

  • Mainline 开发版、最新版 ,Stable 稳定版 ,Legacy 历史版本

使用源码编译安装Nginx

  1. 把下载好的Nginx安装包,源码包结构如下:
    在这里插入图片描述

  2. 安装Nginx依赖环境

    1. 安装gcc环境:yum install gcc-c++
    2. 安装PCRE库,用于解析正则表达式:yum install -y pcre pcre-devel
    3. zlib压缩和解压缩依赖:yum install -y zlib zlib-devel
    4. SSL 安全的加密的套接字协议层,用于HTTP安全传输,也就是https:yum install -y openssl openssl-devel
  3. 上传并解压,需要注意,解压后得到的是源码,源码需要编译后才能安装(安装使用的是1.16版本

    tar -zxvf nginx-1.16.1.tar.gz

  4. 编译之前,先创建nginx临时目录,如果不创建,在启动nginx的过程中会报错

    mkdir /var/temp/nginx -p

  5. 在nginx目录,输入如下命令进行配置,目的是为了创建makefile文件

    ./configure \

    –prefix=/usr/local/nginx \

    –pid-path=/var/run/nginx/nginx.pid \

    –lock-path=/var/lock/nginx.lock \

    –error-log-path=/var/log/nginx/error.log \

    –http-log-path=/var/log/nginx/access.log \

    –http-client-body-temp-path=/var/tmp/nginx/client \

    –http-proxy-temp-path=/var/tmp/nginx/proxy \

    –http-fastcgi-temp-path=/var/tmp/nginx/fcgi \

    –http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \

    –http-scgi-temp-path=/var/tmp/nginx/scgi \

    –with-pcre \

    –with-http_v2_module \

    –with-http_ssl_module \

    –with-http_realip_module \

    –with-http_addition_module \

    –with-http_sub_module \

    –with-http_dav_module \

    –with-http_flv_module \

    –with-http_mp4_module \

    –with-http_gunzip_module \

    –with-http_gzip_static_module \

    –with-http_random_index_module \

    –with-http_secure_link_module \

    –with-http_stub_status_module \

    –with-http_auth_request_module \

    –with-mail \

    –with-mail_ssl_module \

    –with-file-aio \

    –with-ipv6 \

    –with-http_v2_module \

    –with-threads \

    –with-stream \

    –with-stream_ssl_module

    注:\ 代表在命令行中换行,用于提高可读性

    命令解释
    –prefixnginx的安装目录,默认为/usr/local/nginx
    –sbin-pathnginx可执行文件路径,若没有设置则依赖于–prefix
    –conf-path设置nginx.conf配置文件路径,若没有设置则依赖于–prefix,nginx启动时可以通过-c参数指定配置文件
    –error-log-path错误日志路径
    –http-log-pathhttp主请求日志文件
    –pid-path存放nginx进程的pid号
    –lock-path共享存储器互斥锁文件路径
    –http-client-body-temp-path客户端收到请求后,临时存放请求体目录
    –http-proxy-temp-path使用代理后,通过该项设置存放请求体路径
    –http-fastcgi-temp-path设置FastCGI临时文件的目录
    –http-uwsgi-temp-path设置uWSGI临时文件的目录
    –http-scgi-temp-path设置SCGI临时文件的目录
    –user指定nginx运行的用户
    –group指定nginx运行的用户组
    –with-pcre设置PCRE库的源码路径
    –with-http_v2_module用来支持 HTTP 2.0 的
    –with-http_ssl_module如果需要对流量进行加密,可以使用该选项,再URLs中开始部分将会是https(需要OpenSSL库)
    –with-http_gzip_static_module启用gzip模块,在线实时压缩输出数据流
  6. make编译

    make

  7. 安装

    make install

    6、7 步可以整合一条命令 make && make install

    使用 whereis nginx 可以查看nginx安装目录(–prefix指定)

    配置文件在安装目录下的conf文件夹下

    启动文件在安装目录下的sbin文件夹下

    访问Nginx时默认的首页在安装目录下的html文件夹下

  8. 进入nginx安装目录下的sbin目录启动nginx

    启动:./nginx

    停止:./nginx -s stop

    重新加载:./nginx -s reload

    测试配置文件是否正确:./nginx -t

  9. 打开浏览器,访问虚拟机所处内网ip即可打开Nginx默认页面(http://服务器ip:80/)

    在这里插入图片描述

注意事项:

  1. 如果在云服务器安装,需要开启默认的nginx端口:80

  2. 如果在虚拟机安装,需要关闭防火墙

  3. 本地win或mac需要关闭防火墙

    参考链接:https://www.cnblogs.com/weibanggang/p/11484970.html

使用yum安装Nginx

  1. 更新yum

    yum update -y

  2. 打开 http://nginx.org/packages/centos/ 找到自己想要下载的版本rpm文件

    在这里插入图片描述

  3. 手动下载rpm文件或者复制下载文件地址例如:http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.20.2-1.el7.ngx.x86_64.rpm

    服务器没有网络可以先下载rpm包然后上传之后安装,服务器连上网可以直接复制下载地址直接用下载地址安装

  4. 安装Nginx

    rpm -ivh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.20.2-1.el7.ngx.x86_64.rpm

    地址可以替换为手动上传的rpm包文件

  5. 查看Nginx安装信息以及使用Nginx

    nginx -V

    默认配置文件在:/etc/nginx/nginx.conf

    Nginx常用命令:

    systemctl start nginx 启动

    systemctl stop nginx 停止

    systemctl restart nginx 重启

    Nginx默认页面:http://服务器ip:80/

Nginx请求默认页面的流程

  1. Nginx安装完毕之后,默认启动了一个server来监听80端口的所有请求(nginx.conf配置文件可以查看),重点看http配置下的server部分

    #user  nobody;
    worker_processes  1; #工作进程:数目。根据硬件调整,通常等于cpu数量或者2倍cpu数量。
     
    #错误日志存放路径
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
     
    #pid        logs/nginx.pid; # nginx进程pid存放路径
     
     
    events {
        worker_connections  1024; # 工作进程的最大连接数量
    }
     
     
    http {
        include       mime.types; #指定mime类型,由mime.type来定义
        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; #用log_format指令设置日志格式后,需要用access_log来指定日志文件存放路径
                        
        sendfile        on; #指定nginx是否调用sendfile函数来输出文件,对于普通应用,必须设置on。
                如果用来进行下载等应用磁盘io重负载应用,可设着off,以平衡磁盘与网络io处理速度,降低系统uptime。
        #tcp_nopush     on; #此选项允许或禁止使用socket的TCP_CORK的选项,此选项仅在sendfile的时候使用
     
        #keepalive_timeout  0;  #keepalive超时时间
        keepalive_timeout  65;
     
        #gzip  on; #开启gzip压缩服务
     
        #虚拟主机
        server {
            listen       80;  #配置监听端口号
            server_name  localhost; #配置访问域名,域名可以有多个,用空格隔开
     
            #charset koi8-r; #字符集设置
     
            #access_log  logs/host.access.log  main;
     
            location / { #映射的路由
                root   html; #相对路径html文件夹
                index  index.html index.htm; #默认加载的html文件
            }
            #错误跳转页
            #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$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
            #    root           html; #根目录
            #    fastcgi_pass   127.0.0.1:9000; #请求转向定义的服务器列表
            #    fastcgi_index  index.php; # 如果请求的Fastcgi_index URI是以 / 结束的, 该指令设置的文件会被附加到URI的后面并保存在变量$fastcig_script_name中
            #    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; # ssl_prefer_server_ciphers  on; #
     
     
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
     
    }
    
  2. 浏览器输入 http://服务器ip:80/ 访问时最后一个/被映射为根路由,会按配置文件中的配置进行转发,配置了一个location当请求路径为/是会被直接映射到相对于conf文件夹的相对路径下html文件夹中的index.html文件。

Nginx的进程模型

  1. Nginx分master进程和work进程,master只有一个,work可以有多个,在ngxin.conf中配置,一般我们会设置与机器cpu核数一致

    worker_processes  1;
    
  2. master进程主要用来管理worker进程,管理包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

  3. 基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。

  4. 通过master来接收外界的信号,然后将任务分配给worker去做。比如接受一个nginxup -s reload信号后,交给worker去重启,而且当有work进程正在处理请求,那么此work进程还可以延后重启动作。

    参考资料:

    https://blog.csdn.net/No_Game_No_Life_/article/details/104223604

    https://blog.csdn.net/qq_39110766/article/details/81209529

Nginx处理http请求的模型

  1. 当有一个http请求过来时,而且有多个work进程,所有的work进程会有一个抢占机制,这个机制基于一个互斥锁,只有抢到这个锁的work进程才能处理这个请求
    在这里插入图片描述

  2. 传统服务器的请求处理:work进程处理请求是同步阻塞的。当有多个请求过来时,一个work进程处理请求时阻塞了,master会fork出另一个work进程处理后面的请求,这个进程也被阻塞时,master就会继续fork新的进程来处理;这样的话当并发量特别大时,master会fork出非常多的work进程,这样对服务器的性能影响是非常大的。
    在这里插入图片描述

  3. Nginx的请求处理:Nginx的work进程是异步非阻塞的。当有多个请求过来时,一个work进程处理请求时阻塞了,它会去处理下一个请求,**这里work进程用了linux的epoll模型。**采用了epoll模型,一个worker大概可以处理6-8万的请求。所以,CPU越多,并发越大,处理几十万到几百万的请求是没有问题的。
    在这里插入图片描述

    events {
    	# 默认使用epoll,所以实际上可以不配置use epoll
    	use epoll;
    	# 每个worker允许连接的请求最大数目
    	# 不能盲目修改增大,要跟着硬件走,否则请求会产生卡顿
        worker_connections  1024;
    }
    

Nginx的配置结构

在这里插入图片描述

  1. 全局块(main):配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

  2. events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

  3. http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

  4. server块:配置虚拟主机的相关参数,一个http中可以有多个server。最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。

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

  6. main部分设置将会影响其他所有设置,server部分的指令主要用于指定主机和端口。upstream指令主要用于负载均衡,设置一系列的后端服务器,location部分主要用于匹配网页位置。四者的关系如下:server继承main,location继承server,upstream既不继承其他设置,也不被设置所继承

  7. 指令由分号结束;一个大括号包含的一些指令是一个指令块,大括号后方没有分号结尾;注释使用#号;$代表引用一个参数变量;参数和值需要有空格隔开。

    参考地址:

    https://www.cnblogs.com/knowledgesea/p/5175711.html

    https://www.cnblogs.com/badaoliumangqizhi/p/11768875.html

    https://www.linuxidc.com/Linux/2013-11/92594.htm

核心配置文件详解

  1. user:配置了work进程运行使用的用户,默认是nobody,可以修改为root;master进程运行使用的用户是root

  2. worker_processes:配置work进程的数量一般是cpu的核心数或者是核心数减一

  3. error_log:配置错误日志的路径以及日志级别,日志路径一般在编译阶段会指定;Nginx的日志级别有 debug、info、notice、warn、error、crit,信息最详细的是debug

  4. pid:配置Nginx的进程号,一般在编译阶段会指定

  5. events指令块:配置事件处理的一些参数

    1. use:配置work进程处理事件的模型,一般根据服务器系统来配置,Linux使用epoll模型
    2. worker_connections:配置work进程允许连接的客户端最大连接数,根据硬件配置来决定
  6. http指令块:配置http网络传输相关的一些参数

    1. include:导入外部的一个文件,也可以将一个server的配置文件写到外部,使用这个命令来导入conf文件;默认导入了mime.types文件,这个文件定义了常用的mime类型,和用于表示的简写。
    2. default_type:默认的类型,application/octet-stream
    3. log_format:定义日志文件格式化的格式
    4. access_log:定义请求日志文件的地址,一般在编译时定义
    5. sendfile:配置是否高效传输文件
    6. tcp_nopush:配置是不是把数据包累积到一定大小再发送,要先开启sendfile才会生效
    7. keepalive_timeout:配置客户端连接服务器的超时时间,http请求和服务器建立连接之后,完成请求不会马上断开,有新的请求过来时会复用这个连接,只有超时时间到了这个连接才会断开。若需要客户端每次都建立新的连接则设置参数值为0
    8. gzip:配置是否开启数据压缩
    9. server指令块:配置一个虚拟主机或虚拟服务
      1. listen:配置虚拟主机监听的端口号

      2. server_name:配置监听的主机名,可以是localhost,也可以是域名,当请求的host和端口与配置的虚拟主机相匹配之后就会使用此虚拟主机中的配置

      3. localhost:配置路由的匹配规则,/代表的是根路径

        1. root:配置映射目录的上级目录,并且该上级目录要含有location指定名称的同名目录。

        2. alias:配置映射目录的绝对路径

          参考资料:

          root和alias的区别:https://www.jb51.net/article/94367.htm

        3. index:配置访问此location若没有指定具体访问的页面时,则默认打开的页面。

      4. error_page:配置拦截访问报错时默认跳转的页面

Nginx报错pid找不到的解决办法

在这里插入图片描述

  1. 检查此文件的父文件夹是否存在,若不存在就创建一个

    mkdir -p pid文件夹路径

  2. 尝试重启Nginx

    ./nginx -s reload

  3. 若报错为下面这个,则尝试指定配置文件启动

    在这里插入图片描述

    ./nginx -c 配置文件地址

    启动完成后尝试访问Nginx

  4. 若还是不行,则尝试使用配置文件中的pid路径配置

    打开主要配置文件,在worker_processes下添加:

    pid /pid文件夹路径/nginx.pid

    此路径必须为nginx可以访问的路径,再重新执行1、2、3步

Nginx常用命令

  1. ./nginx -s stop:强制停止Nginx,若有黑客正在拉取数据可以使用此命令
  2. ./nginx -s quit:正常退出Nginx,若有进程正在处理http请求,则会等待请求处理完成才会退出。
  3. ./nginx -t:监测配置文件是否正确
  4. ./nginx -v:查看Nginx的版本
  5. ./nginx -V:查看Nginx的详细信息
  6. ./nginx -h或者 ./nginx -? :查看Nginx的帮助信息
  7. ./nginx -c 配置文件路径:手动指定启动时加载的配置文件

未完待续

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-01-24 11:21:19  更:2022-01-24 11:23:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 7:30:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码