• nginx详解反向代理、负载均衡、LNMP架构上线动态网站


    简介

    Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发的,它已经在该站点运行超过两年半了。Igor Sysoev在建立的项目时,使用基于BSD许可。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

    Nginx和Apache的区别(重要

    Nginx

    1. 轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源
    2. 抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apache 高很多,而 apache 则是阻塞型的。在高并发下 nginx 能保持低资源低消耗高性能 ,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
    3. nginx 处理静态文件好,静态处理性能比 apache 高三倍以上
    4. nginx 的设计高度模块化,编写模块相对简单
    5. nginx 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃
    6. nginx 作为负载均衡服务器,支持 7 层负载均衡
    7. nginx 本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器
    8. 启动特别容易, 并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,还能够不间断服务的情况下进行软件版本的升级
    9. 社区活跃,各种高性能模块出品迅速

    Apache

    1. apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache
    2. apache 发展到现在,模块超多,基本想到的都可以找到
    3. apache 更为成熟,少 bug ,nginx 的 bug 相对较多
    4. apache 超稳定
    5. apache 对 PHP 支持比较简单,nginx 需要配合其他后端用
    6. apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 apache 去做,nginx 适合静态和反向。

    总结

    apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区

    两者最核心的区别在于 apache 是同步多进程模型,一个连接对应一个进程,而 nginx 是异步的,多个连接(万级别)可以对应一个进程

    一般来说,需要性能的 web 服务,用 nginx 。如果不需要性能只求稳定,更考虑 apache ,后者的各种功能模块实现得比前者,例如 ssl 的模块就比前者好,可配置项多。epoll(freebsd 上是 kqueue ) 网络 IO 模型是 nginx 处理性能高的根本理由,但并不是所有的情况下都是 epoll 大获全胜的,如果本身提供静态服务的就只有寥寥几个文件,apache 的 select 模型或许比 epoll 更高性能。当然,这只是根据网络 IO 模型的原理作的一个假设,真正的应用还是需要实测了再说的。

    更为通用的方案是,前端 nginx 抗并发,后端 apache 集群,配合起来会更好。

    nginx配置文件

    该文件在   /etc/nginx/nginx.conf

    #nginx进程,一般设置为和cpu核数一样
    worker_processes 4;                        
    #错误日志存放目录 
    error_log  /data1/logs/error.log  crit;  
    #运行用户,默认即是nginx,可不设置
    user nginx       
    #进程pid存放位置
    pid        /application/nginx/nginx.pid;        
    
    #Specifies the value for maximum file descriptors that can be opened by this process. 
    #最大文件打开数(连接),可设置为系统优化后的ulimit -HSn的结果
    worker_rlimit_nofile 51200;
    
    cpu亲和力配置,让不同的进程使用不同的cpu
    
    worker_cpu_affinity 0001 0010 0100 1000 0001 00100100 1000;
    
    #工作模式及连接数上限
    events 
    {
      use epoll;       #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
      worker_connections 1024;  #;单个后台worker process进程的最大并发链接数
    }
    ###################################################
    http 
    {
    
    include mime.types; #文件扩展名与类型映射表
    default_type application/octet-stream; #默认文件类型
    
    
    
    
      #隐藏响应header和错误通知中的版本号
      server_tokens off;
      #开启高效传输模式   
      sendfile on;
    
    -------------------------------------------------------------------------------------------------
      #激活tcp_nopush参数可以允许把httpresponse header和文件的开始放在一个文件里发布,
      积极的作用是减少网络报文段的数量
      tcp_nopush     on;
      #激活tcp_nodelay,内核会等待将更多的字节组成一个数据包,从而提高I/O性能
      tcp_nodelay on;
    #连接超时时间,单位是秒
      keepalive_timeout 60;
    
      #开启gzip压缩功能
        gzip on;
     #设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,表示不管页面多大都进行压缩。建议设置成大于1K。如果小于1K可能会越压越大。
      gzip_min_length  1k;
    
    #压缩缓冲区大小。表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
      gzip_buffers     4 16k;
    
    #压缩版本(默认1.1,前端为squid2.5时使用1.0)用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可。
      gzip_http_version 1.0;
    
    #压缩比率。用来指定GZIP压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理最慢,也比较消耗cpu资源。
      gzip_comp_level 9;
    
    #用来指定压缩的类型,“text/html”类型总是会被压缩
      gzip_types       text/plain application/x-javascript text/css application/xml;
      #vary header支持。该选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用
    
    Squid缓存经过Nginx压缩的数据。
    
    gzip_vary off;
    #开启ssi支持,默认是off
      ssi on;
      ssi_silent_errors on;
    #设置日志模式
        log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
                            '$status $body_bytes_sent "$http_referer" '
                            '"$http_user_agent" $http_x_forwarded_for';
    
    #反向代理负载均衡设定部分
    
    #upstream表示负载服务器池,定义名字为backend_server的服务器池
    upstream backend_server {
        server   10.254.244.20:81 weight=1 max_fails=2 fail_timeout=30s;
        server   10.254.242.40:81 weight=1 max_fails=2 fail_timeout=30s;
        server   10.254.245.19:81 weight=1 max_fails=2 fail_timeout=30s;
        server   10.254.243.39:81 weight=1 max_fails=2 fail_timeout=30s;
      #设置由 fail_timeout 定义的时间段内连接该主机的失败次数,以此来断定 fail_timeout 定义的时间段内该主机是否可用。默认情况下这个数值设置为 1。零值的话禁用这个数量的尝试。
    
    设置在指定时间内连接到主机的失败次数,超过该次数该主机被认为不可用。
    
    #这里是在30s内尝试2次失败即认为主机不可用!
      }
    ###################
    
    #基于域名的虚拟主机
      server
      {
    
    #监听端口
        listen       80;
        server_name  www.abc.com abc.com;    
        index index.html index.htm index.php;    #首页排序
        root  /data0/abc;                            #站点根目录,即网站程序存放目录 
        error_page 500 502 404 /templates/kumi/phpcms/404.html;   #错误页面
    #伪静态   将www.abc.com/list....html的文件转发到index.php。。。
    #rewrite ^/list-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+).html$ /index.php?m=content&c=index&a=lists&catid=$1&types=$2&country=$3&language=$4&age=$5&startDate=$6&typeLetter=$7&type=$8&page=$9 last;
    #location 标签,根目录下的.svn目录禁止访问
        location ~ /.svn/ {
         deny all;
        }
                location ~ .php$   
                 {  #符合php扩展名的请求调度到fcgi server  
                  fastcgi_pass  127.0.0.1:9000;  #抛给本机的9000端口
                  fastcgi_index index.php;    #设定动态首页
                  include fastcgi.conf;
                 }

     

    nginx实现反向代理和负载均衡

    反向代理:在收到客户端请求之后,会修目标IP地址和端口

    正向代理:在收到客户端请求之后,会修源IP地址和端口

    上游服务器:代理服务器后端的哪些真正给客户端提供服务的节点,这样的服务器称之为上游服务器

    下游服务器:客户端就是下游节点

    反向代理指令

    只有proxy_pass 是必须的

    模块:nginx_http_proxy_module
        指令
        proxy_pass:指定上游服务器的ip和端口
        proxy_set_header:指定在重新封装请求报文的时候,添加一个新的首部
    
    
        Syntax:     proxy_pass URL;
        Default:     —
        Context:     location, if in location, limit_except
        例子:proxy_pass http://10.220.5.200:80;
    
    
        Syntax:     proxy_set_header field value;
        Default:     proxy_set_header Host $proxy_host;
        Context:     http, server, location

    例如

    location / {
            proxy_pass http://10.220.5.180;
            }

    反向代理实战案例

    1.环境准备

    centos7.5

    反向代理服务器IP:172.20.10.7/28

    web1服务器IP:172.20.10.8/28

    web2服务器IP:172.20.10.9/28

    2.配置反向代理服务器端

    yum安装nignx需要配置网络源,复制下面的代码到你的yum仓库中

    
    [ken]
    name=ken
    enabled=1
    gpgcheck=0
    baseurl=https://mirrors.aliyun.com/epel/7Server/x86_64/

    安装

    [root@ken ~]# yum install nginx -y

    配置nginx文件,我们实现这样一个效果,静态文件都被代理到172.20.10.8,动态文件都被调度到172.20.10.9,实现动静分离。

    [root@ken ~]# vim /etc/nginx/nginx.conf
    # For more information on configuration, see:
    #   * Official English Documentation: http://nginx.org/en/docs/
    #   * Official Russian Documentation: http://nginx.org/ru/docs/
    
    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    
    # Load dynamic modules. See /usr/share/nginx/README.dynamic.
    include /usr/share/nginx/modules/*.conf;
    
    events {
        worker_connections 1024;
    }
    
    http {
        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 2048;
    
        include             /etc/nginx/mime.types;
        default_type        application/octet-stream;
           # include /etc/nginx/conf.d/*.conf;
    
        server {
            listen       80 default_server;
            listen       [::]:80 default_server;
            server_name  _;
            root         /var/www/html;
            index index.html index.php;
            # Load configuration files for the default server block.
       location /songqi {                                   #在页面输入当前IP后在后面加上 /songqi 即可
            proxy_pass http://172.20.10.8/;                  #上游节点,也即是访问这个页面时跳转到的网页,后面最好加 / ,免去创建同名目录的麻烦 
            }
            location ~ /.*.php$ {               #动态网页配置,使用了正则表达式
            proxy_pass http://172.20.10.9;                 #使用了正则表达式所以不能在后面加 /
            proxy_set_header host $proxy_host;
            proxy_set_header realip $remote_addr;
            }
    
            error_page 404 /404.html;
                location = /40x.html {
            }
    
            error_page 500 502 503 504 /50x.html;
                location = /50x.html {
            }
        }
    }
  • 相关阅读:
    Ubuntu18.04安装Virtualenv虚拟环境
    SQLite3学习笔记----创建数据库的两种方式
    Git学习笔记-----下载GitHub上某个分支的代码
    Git学习笔记——从一台电脑上传文件到Github上
    plsql配置数据库连接
    Java与各种数据库连接代码
    marquee上下左右循环无缝滚动代码
    仅用aspx文件实现Ajax调用后台cs程序。(实例)
    MVC 5使用TempData(对象)跨视图传递数据
    SQL Server中查询数据库及表的信息语句
  • 原文地址:https://www.cnblogs.com/tomsongqi/p/10758922.html
Copyright © 2020-2023  润新知