nginx入门到入门

Nginx是俄罗斯人用c语言编写的十分轻量级的HTTP服务器,同时也能作为邮件服务器、反向代理服务器、静态资源服务器。

简介

  • Nginx以事件驱动的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理、负载平衡。其拥有匹配Lighttpd的性能,同时还没有Lighttpd的内存泄漏问题。
  • Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 。它支持内核Poll模型,能经受高负载的考验,有报告表明能支持高达 50,000个并发连接数。
  • Nginx具有很高的稳定性。其它HTTP服务器,当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应,只能重启服务器。例如当前apache一旦上到200个以上进程,web响应速度就明显非常缓慢了。而Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。nginx官方表示保持10,000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对nginx来说基本上是毫无用处的。就稳定性而言,nginx比lighthttpd更胜一筹。
  • Nginx支持热部署。它的启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行进行升级。
  • ……

HTTP基础功能:

  • 处理静态文件,索引文件以及自动索引;
  • 反向代理加速(无缓存);
  • FastCGI,简单的负载均衡和容错;
  • 模块化的结构。过滤器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;
  • SSL 和 TLS SNI 支持;

基本概念:

1.正向代理:

用户访问代理服务器。网站对用户不透明。对用户服务。

2.反向代理:

用户访问反向代理服务器。但是用户不知道访问的是反向代理服务器多个站点中的哪一个站点。对服务器服务。

3.负载均衡

nginx 的 upstream目前支持 4 种方式的分配 1)、轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 2)、weight:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 2)、ip_hash :每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 3)、fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。 4)、url_hash(第三方)

4.异步非阻塞

和node类似Nginx 采用了异步非阻塞的方式来处理请求。Nginx 采用的是多 worker 的方式来处理请求,每个 worker 里面只有一个主线程,每个worker线程都继承了高并发的特性。 想想 apache 的常用工作方式(apache 也有异步非阻塞版本,但因其与自带某些模块冲突,所以不常用),每个请求会独占一个工作线程,当并发数上到几千时,就同时有几千的线程在处理请求了。这对操作系统来说,是个不小的挑战,线程带来的内存占用非常大,线程的上下文切换带来的 cpu 开销很大,自然性能就上不去了,而这些开销完全是没有意义的。

命令

1.安装

osx 用homebrew

brew install nginx

2.nginx命令

命令

注释

nginx

启动nginx,按照默认路径

nginx -t

测试配置正确性、也可查询默认配置路径

nignx -c 路径

按照指定路径[启动

...]

nginx -s reload

平滑重启

nginx -s stop

停止nginx

nginx -v

显示 nginx 的版本

nginx -V

nginx 的版本,编译器版本和配置参数。

3.nginx信号

启动nginx后会根据配置生成一个master进程和多个worker进程(由参数worker_processes配置,一般为机器cpu核数)master 来管理 worker 进程,所以我们只需要与 master 进程通信就行了。master 进程会接收来自外界发来的信号,再根据信号做不同的事情。所以我们要控制 Nginx,只需要通过 kill 向 master 进程发送信号就行了,例如:

kill -HUP pid 
//平滑重启nginx//pid是nginx的进程//若在nginx.conf配置了pid文件存放路径则该文件存放的就是Nginx主进程号//可用路径代替pid ,例如: '/usr/nginx/logs/nginx.pid'

master进程:

信号

注释

TERM, INT

快速关闭

QUIT

从容关闭

HUP

重载配置 \ 用新的配置开始新的工作进程 \ 从容关闭旧的工作进程

USR1

重新打开日志文件

USR2

平滑升级可执行程序。

WINCH

从容关闭工作进程

worker进程:

信号

注释

TERM, INT

快速关闭

QUIT

从容关闭

USR1

重新打开日志文件

conf配置

基本参数

#运行用户
user nobody;
#启动进程,通常设置成和cpu的数量相等
worker_processes  2;
#nginx pid进程号存储地址pid        
logs/nginx.pid;
events {    
    #ulimit -n 一个进程所能够打开的文件的最大数 
    #反向代理,最大并发数 
    worker_connections * worker_processes/2
    worker_connections  1024;
}

负载均衡

在http节点里添加: #定义负载均衡设备的 Ip及设备状态

upstream myServer {   
    server 127.0.0.1:9090 down; 
    server 127.0.0.1:8080 weight=2; 
    server 127.0.0.1:6060; 
    server 127.0.0.1:7070 backup; 
    ip_hash;  
}

在需要使用负载的Server节点下添加

proxy_pass http://myServer;

upstream 每个设备的状态:

  • down :表示单前的server暂时不参与负载
  • weight :默认为1.weight越大,负载的权重就越大。
  • max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
  • fail_timeout:max_fails 次失败后,暂停的时间。
  • backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

ip_hash 使用负载均衡服务器一多就会出现一个问题,那怎么实现多台服务器之间session的共享。其中一个方案就是ip_hash。nginx中的ip_hash能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session;

nginx 编程

1.nginx变量

Nginx 变量的创建和赋值操作发生在全然不同的时间阶段。Nginx 变量的创建只能发生在 Nginx 配置加载的时候,或者说 Nginx 启动的时候;而赋值操作则只会发生在请求实际处理的时候。这意味着不创建而直接使用变量会导致启动失败,同时也意味着我们无法在请求处理时动态地创建新的 Nginx 变量。

server {
        listen 8080;
        location /foo {            
             echo "foo = [$foo]";
        }
        location /bar {
            set $foo 32;
            echo "foo = [$foo]";
        }
    }

我们使用了标准 ngx_rewrite 模块的 set 配置指令对变量 $a 进行了赋值操作。特别地,我们把字符串 hello world 赋给了它。 这里我们使用第三方 ngx_echo 模块的 echo 配置指令将 $foo 变量的值作为当前请求的响应体输出。

我们用curl访问地址:

$ curl 'http://localhost:8080/foo'     
//foo = []$ curl 'http://localhost:8080/bar'    
//foo = [32]

2.Nginx 内建变量

例如由 ngx_http_core 模块提供的内建变量 $uri,可以用来获取当前请求的 URI(经过解码,并且不含请求参数),而 $request_uri 则用来获取请求最原始的 URI (未经解码,并且包含请求参数)。但是大部分内建变量类似保留值不可被赋值。

location /test {
   echo "uri = $uri";   
   echo "request_uri = $request_uri";   
   echo "name: $arg_name";//name不区分大小写
}

$ curl "http://localhost:8080/test?Name=aaa"
 :uri = /test   
 :request_uri = /test
 :name: aaa
 
$ curl "http://localhost:8080/test?a=3&b=4":uri = /
   test:request_uri = /test?a=3&b=4
:name:

也有一些内建变量是支持改写的,其中一个例子是 $args. 这个变量在读取时返回当前请求的 URL 参数串(即请求 URL 中问号后面的部分,如果有的话),而在赋值时可以直接修改参数串:

location /test {
   set $orig_a $arg_a;   
   set $args "a=5";   
   echo "original a: $orig_a";   
   echo "a: $arg_a";
}

$ curl 'http://localhost:8080/test?a=3':original a: 3
:a: 5

原本$arg_a应该返回参数a=3,但是访问时赋值了$args 'a=5',所以取$arg_a时返回了5;

作者:gavinDu 链接:https://www.jianshu.com/p/c51cf712ab05 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文发布于微信公众号 - nginx(nginx-study)

原文发表时间:2018-04-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

熔断器设计模式

如果大家有印象的话,尤其是夏天,如果家里用电负载过大,比如开了很多家用电器,就会”自动跳闸”,此时电路就会断开。在以前更古老的一种方式是”保险丝”,当负载过大,...

2805
来自专栏丑胖侠

Zookeeper开源客户端Curator之基本功能讲解

简介 Curator是Netflix公司开源的一套Zookeeper客户端框架。了解过Zookeeper原生API都会清楚其复杂度。Curator帮助我们在其基...

3585
来自专栏c#开发者

消息队列(Message Queue)简介及其使用

消息队列(Message Queue)简介及其使用 利用 MSMQ(Microsoft Message Queue),应用程序开发人员可以通过发送和接收消息方...

5048
来自专栏玄魂工作室

如何学python 第十九课 文件操作

今天我们来说说文件操作。文件操作在程序编写里有着举足轻重的作用。文件操作,主要包含文件的输入和输出。学会了文件操作,就可以写出更符合实际需求的脚本。 我会先介绍...

37711
来自专栏枕边书

初探PHP多进程

准备 我们都知道PHP是单进程执行的,PHP处理多并发主要是依赖服务器或PHP-FPM的多进程及它们进程的复用,但PHP实现多进程也意义重大,尤其是在后台Cli...

3598
来自专栏一个会写诗的程序员的博客

Cookie 和 Session 机制原理分析 & 区别对比

Web application servers are generally "stateless":

1612
来自专栏用户2442861的专栏

redis 学习指南

http://www.cnblogs.com/hoojo/p/4466024.html

2121
来自专栏ytkah

dedecms如何快速删除跳转的文章(记得清空内容回收站)

  网站内容更新多了,有些页面修改了,这时其他相关页面也要做相应的调整,不然可能会出现404错误,那么dedecms如何快速删除跳转的文章呢?下面就随ytkah...

2816
来自专栏张戈的专栏

WP Super Cache静态缓存插件纯代码版(兼容多域名网站)

中午,小熊发来一篇来自歧路亡羊博客的精彩教程:《wordpress 利用代码来实现缓存》。粗略看了一下,发现这个代码在几个月之前我就用过,不过由于此代码无法区分...

5107
来自专栏北京马哥教育

Django 1.11官方教程翻译

一直以来由于英语废所以极端抵触看英文文档。感觉人还是要逼一下自己,所以就有了这篇翻译。如果有翻译错误的地方欢迎在评论中指正。 Let’s learn by e...

6366

扫码关注云+社区

领取腾讯云代金券