作者: admin

  • 全面了解 Nginx 主要应用场景

    nginx_icon

    nginx 笔记 推荐

    本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得。所以还请见谅,同时欢迎留言交流

     

    Nginx能做什么

    1.反向代理

    2.负载均衡

    3.HTTP服务器(包含动静分离)

    4.正向代理

    以上就是我了解到的Nginx在不依赖第三方模块能处理的事情,下面详细说明每种功能怎么做

     

     

    反向代理

    效果:一个服务器上就一个80端口,但是服务器上想搭建多个网站,想要实现访问域名就能直接访问不同网站并且都是通过80端口访问的话,就使用nginx反向代理的功能就合适了。

    server { 
     listen 80; 
     server_name localhost; 
     client_max_body_size 1024M;
     
     location / {
     proxy_pass http://localhost:8080;
     proxy_set_header Host $host:$server_port;
     }
    }

     

     

    负载均衡

    负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。

    1、RR(默认)

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

    upstream test {
     server localhost:8080;
     server localhost:8081;
    }
    
    server {
       listen 81; 
       server_name localhost; 
       client_max_body_size 1024M;
     
       location / {
         proxy_pass http://test;
         proxy_set_header Host $host:$server_port;
       }
    }

    这里我配置了2台服务器,当然实际上是一台,只是端口不一样而已,而8081的服务器是不存在的,也就是说访问不到,但是我们访问http://localhost 的时候,也不会有问题,会默认跳转到http://localhost:8080 具体是因为Nginx会自动判断服务器的状态,如果服务器处于不能访问(服务器挂了),就不会跳转到这台服务器,所以也避免了一台服务器挂了影响使用的情况,由于Nginx默认是RR策略,所以我们不需要其他更多的设置。

     

    2、权重 (分配概率)

    upstream test {
     server localhost:8080 weight=9;
     server localhost:8081 weight=1;
    }

    那么10次一般只会有1次会访问到8081,而有9次会访问到8080

     

    3、ip_hash

    如果一个客户第一次登陆某台服务器中就保存了session的登陆信息在这台服务器中,万一下次分配到别的服务器就需要重新登陆不是很麻烦吗?所以就需要ip_hash,如果该客户第一次把session保存到了该服务器以后就一直访问该服务器,就不需要重新登陆了。所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

    upstream test {
     ip_hash;
     server localhost:8080;
     server localhost:8081;
    }

     

    4、fair(第三方)

    按后端服务器的响应时间来分配请求,响应时间短的优先分配,哪台服务器运行快就先分配给哪台服务器。

    upstream backend {
     fair;
     server localhost:8080;
     server localhost:8081;
    }

     

    5、url_hash(第三方)

    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

    upstream backend {
     hash $request_uri;
     hash_method crc32;
     server localhost:8080;
     server localhost:8081;
    }

    以上5种负载均衡各自适用不同情况下使用,所以可以根据实际情况选择使用哪种策略模式,不过fair和url_hash需要安装第三方模块才能使用,由于本文主要介绍Nginx能做的事情,所以Nginx安装第三方模块不会再本文介绍

     

     

     

    HTTP服务器

    Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现,首先看看Nginx做静态资源服务器

    server {
     listen 80; 
     server_name localhost; 
     client_max_body_size 1024M;
     
     
     location / {
       root e:wwwroot;
       index index.html;
     }
    }

    这样如果访问http://localhost 就会默认访问到E盘wwwroot目录下面的index.html,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。

     

     

    动静分离

    动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路

    upstream test{ 
     server localhost:8080; 
     server localhost:8081; 
    } 
     
    server { 
     listen 80; 
     server_name localhost; 
     
     location / { 
       root e:wwwroot; 
       index index.html; 
     } 
     
     # 所有静态请求都由nginx处理,存放目录为html 
     location ~ .(gif|jpg|jpeg|png|bmp|swf|css|js)$ { 
       root e:wwwroot; 
     } 
     
     # 所有动态请求都转发给tomcat处理 
     location ~ .(jsp|do)$ { 
       proxy_pass http://test; 
     } 
     
     error_page 500 502 503 504 /50x.html; 
     location = /50x.html { 
       root e:wwwroot; 
     } 
    }

    这样我们就可以吧HTML以及图片和css以及js放到wwwroot目录下,而tomcat只负责处理jsp和请求,例如当我们后缀为gif的时候,Nginx默认会从wwwroot获取到当前请求的动态图文件返回,当然这里的静态文件跟Nginx是同一台服务器,我们也可以在另外一台服务器,然后通过反向代理和负载均衡配置过去就好了,只要搞清楚了最基本的流程,很多配置就很简单了,另外localtion后面其实是一个正则表达式,所以非常灵活

     

     

    正向代理

    正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。当你需要把你的服务器作为代理服务器的时候,可以用Nginx来实现正向代理,但是目前Nginx有一个问题,那么就是不支持HTTPS,虽然我百度到过配置HTTPS的正向代理,但是到最后发现还是代理不了,当然可能是我配置的不对,所以也希望有知道正确方法的同志们留言说明一下。

    resolver 114.114.114.114 8.8.8.8;
    server {
     
      resolver_timeout 5s;
     
      listen 81;
     
      access_log e:wwwrootproxy.access.log;
      error_log e:wwwrootproxy.error.log;
     
     location / {
       proxy_pass http://$host$request_uri;
     }
    }

    resolver是配置正向代理的DNS服务器,listen 是正向代理的端口,配置好了就可以在ie上面或者其他代理插件上面使用服务器ip+端口号进行代理了。

     

     

    持热启动

    Nginx是支持热启动的,也就是说当我们修改配置文件后,不用关闭Nginx,就可以实现让配置生效,当然我并不知道多少人知道这个,反正我一开始并不知道,导致经常杀死了Nginx线程再来启动。。。Nginx从新读取配置的命令是

    nginx -s reload

     

  • centos 6.x修改系统时间

    查看时间:

    date +"%Y-%m-%d %H:%M:%S"   //输出:2017-06-29 15:58:46

     

     

    修改时间:

    date -s '2017-02-02 10:10:00'

     

    参数信息:

    % : 印出 % 
    %n : 下一行 
    %t : 跳格 
    %H : 小时(00..23) 
    %I : 小时(01..12) 
    %k : 小时(0..23) 
    %l : 小时(1..12) 
    %M : 分钟(00..59) 
    %p : 显示本地 AM 或 PM 
    %r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M) 
    %s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数 
    %S : 秒(00..61) 
    %T : 直接显示时间 (24 小时制) 
    %X : 相当于 %H:%M:%S 
    %Z : 显示时区 
    
    日期方面 : 
    %a : 星期几 (Sun..Sat) 
    %A : 星期几 (Sunday..Saturday) 
    %b : 月份 (Jan..Dec) 
    %B : 月份 (January..December) 
    %c : 直接显示日期与时间 
    %d : 日 (01..31) 
    %D : 直接显示日期 (mm/dd/yy) 
    %h : 同 %b 
    %j : 一年中的第几天 (001..366) 
    %m : 月份 (01..12) 
    %U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形) 
    %w : 一周中的第几天 (0..6) 
    %W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形) 
    %x : 直接显示日期 (mm/dd/yy) 
    %y : 年份的最后两位数字 (00.99) 
    %Y : 完整年份 (0000..9999)

    http://www.cnblogs.com/wych/p/4180382.html

  • node.js执行linux shell代码

    node shell

    node.js 子进程

    ls -a //列出所有文件及文件夹,并显示所有隐藏文件

    异步:(常用)
    spawn,exec,execFile,fork

     

    1,spawn

    var child = require('child_process');
    var du = child.spawn('ls', ['-a']);
    
    du.stdout.on('data', function (data) {
       console.log('输出内容是 ' + data); //输出的内容和直接执行ls -a的效果一样
    });
    
    du.stderr.on('data', function (data) {
       console.log('stderr: ' + data);
    });
    
    du.on('exit', function (code) {
       console.log('child process exited with code ' + code);
    });

     

    2,exec

    //推荐,可直接一句话执行,并且有回调

    var childProcess = require('child_process');
    childProcess.exec('ls -a', function (error, stdout, stderr) {
     if (error) {
       console.log(error.stack);
       console.log('Error code: '+error.code);
     }
       console.log('输出内容是: '+stdout);
    });

     

    3,execFile

    //加载并执行命令文件,参数需要数组形式

    var childProcess = require('child_process');
    var path = ".";
    childProcess.execFile('/bin/ls', ['-l', path], function (err, result) {
      console.log(result)
    });

     

    4,fork

    //进程之间传参

    //pather.js
    var childProcess = require('child_process');
    var n = childProcess.fork('./son.js'); //引入要监听的模块
    
    n.on('message', function(m) {
      console.log('儿子发来的信息: ', m); //此处是,老爸接受到儿子发来的信息
    });
    n.send({ hello: '儿子我是老爸' }); //此处是,老爸给儿子发送的信息
    
    
    
    //son.js
    process.on('message', function(m) {
     console.log('老爸发来的信息:', m); //收到。老爸发来的信息
    });
    process.send({ Hello: '老爸我是儿子' }); //向老爸发送信息
    process.exit(0);  //儿子发数据给老爸后,任务完成退出。

     

     

    同步:
    spawnSync,execFileSync,execSync

  • CentOS安装Nginx 报错“configure: error: the HTTP rewrite module requires the PCRE library”解决办法

    错误提示:
    ./configure: error: the HTTP rewrite module requires the PCRE library.

    安装pcre-devel与openssl-devel解决问题

    yum -y install pcre-devel openssl openssl-devel
  • 阿里云服务器购买、及注意细节

    阿里云 防火墙 端口

    1,一般购买就自带lamp功能初始化密码都会在/root/default.pass

     

    2,允许直接访问服务器ip地址,例如http://123.123.123.123 或者http://123.123.123.123:8888。默认情况下阿里云服务器就仅仅开放3389或者22端口而已,需要允许访问指定端口需要自己手动设置。

    步骤:云服务器ESC—-网络和安全—-安全组—-点击“配置规则”

    aliyun