初识 Nginx

Nginx 是一个免费的,开源的,高性能的HTTP服务器和反向代理,以及IMAP / POP3代理服务器。 Nginx

以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。很多高知名度的网站都使用

Nginx,如:Netflix,GitHub,SoundCloud,MaxCDN 等。

Nginx 有一个主线程( master process)和几个工作线程(worker process)。主线程的目的是加载验证配置文件、维护工作线程。

工作线程处理实际的请求,Nginx 采用基于事件的模型和依赖操作系统的机制在工作线程之间高效地分发请求。工作线程的数量可配置,也可自动调整为服务器CPU的数量。

Nginx 及其模块的工作方式由配置文件确定。 默认情况下,配置文件名为nginx.conf,放在/usr/local/nginx/conf、/etc/nginx或者/usr/local/etc/nginx文件夹中。

基本命令

Nginx 启动之后,可以使用以下命令控制:

nginx -s

其中-s意思是向主进程发送信号,signal可以为以下四个中的一个:

stop— 快速关闭

quit— 优雅关闭

reload— 重新加载配置文件

reopen— 重新打开日志文件

当运行nginx -s quit时,Nginx 会等待工作进程处理完成当前请求,然后将其关闭。当你修改配置文件后,并不会立即生效,而是等待重启或者收到nginx -s reload信号。

当 Nginx 收到nginx -s reload信号后,首先检查配置文件的语法。语法正确后,主线程会开启新的工作线程并向旧的工作线程发送关闭信号,如果语法不正确,则主线程回滚变化并继续使用旧的配置。当工作进程收到主进程的关闭信号后,会在处理完当前请求之后退出。

配置文件

Nginx 配置的核心是定义要处理的URL以及如何响应这些URL请求,即定义一系列的虚拟服务器(Virtual Servers)控制对来自特定域名或者 IP 的请求的处理。

每一个虚拟服务器定义一系列的location控制处理特定的 URI 集合。每一个location定义了对映射到自己的请求的处理场景,可以返回一个文件或者代理此请求。

Nginx 由不同的模块组成,这些模块由配置文件中指定的指令控制。 指令分为简单指令块指令

一个简单指令包含指令名称指令参数,以空格分隔,以分号(;)结尾。 块指令与简单指令类似,但是由大括号({和})包围。 如果块指令大括号中包含其他指令,则称该指令为上下文(如:events,http,server和location)。

配置文件中的放在上下文之外的指令默认放在主配置文件中(类似继承主配置文件)。events和http放置在主配置文件中,server放置在http块指令中,location放置在server块指令中。

配置文件的注释以#开始。

静态内容

Web 服务器一个重要的功能是服务静态文件(图像或静态HTML页面)。例如,Nginx 可以很方便的让服务器从/data/www获取 html 文件,从/data/images获取图片来返回给客户端,这只需要在http块指令中的server块指令中设置两个location块指令。

首先,创建/data/www目录,并放入index.html,创建/data/images目录并在其中放置一些图片。

接下来,打开配置文件。 创建一个server块:

http { server {

}

}

通常,配置文件可以包括多个server块,它们以端口服务器名称来区分。当 Nginx 决定某一个server处理请求后,它将请求头中的URI和server块中的location块进行对比。

加入location块指令到server中:

将以下位置块添加到服务器块:

location / { root /data/www;

}

上面的location块指定/前缀与请求中的URI对比。对于匹配的请求,URI将被添加到root指令中指定的路径,即/data/www,以此形成本地文件系统的路径,如访问http://localhost/bog/welcome.html,对应服务器文件路径为/data/www/bog/welcome.html。 如果URI匹配多个location块,Nginx 采用最长前缀匹配原则(类似计算机网络里面的IP匹配), 上面的location块前缀长度为 1,因此只有当所有其他location块匹配时,才使用该块。

接下来,添加第二个位置块:

location /images/ { root /data;

}

它将匹配以/images/(/也匹配这样的请求,但具有较短的前缀)开始的请求。

server块的最终配置如下:

server { location / { root /data/www;

} location /images/ { root /data;

}

}

到目前为止,这已经是一个可以正常运行的服务器,它监听端口80,并且可以在本地计算机上访问http://localhost/。 对于/images/开头的请求,服务器将从/data/images目录发送文件。 如,对于http://localhost/images/example.png请求,nginx 将响应/data/images/example.png文件。 如果不存在,nginx 将返回404。URI不以/images/开头的请求将映射到/data/www目录。 例如,对于http://localhost/some/example.html请求,nginx 将响应/data/www/some/example.html文件。

代理服务器

Nginx 的一个常见应用是将其设置为代理服务器(Proxy Server),即接受客户端的请求并将其转发给代理服务器,再接受代理服务器发来的响应,将它们发送到客户端。

比如我们可以用一个 Nginx 实例实现对图片文件的请求使用本地文件系统,而其他请求转发到代理服务器。

首先,向 Nginx 的配置文件中添加一个server块来定义代理服务器:

server { listen 8080; root /data/up1; location / {

}

}

此服务器侦听端口8080,并将所有请求映射到本地文件系统上的/data/up1目录。 创建此目录并将index.html放入其中。 注意,root指令放在server上下文中,这样 当location块中不含root指令时将使用所属server的root指令。

接下来,使用上一节中的服务器配置,并将其修改为代理服务器配置。 在第一个位置块中,加上proxy_pass指令:

server { location / { # proxy_pass指令的参数为:协议+主机名+端口号

proxy_pass http://localhost:8080;

} location /images/ { root /data;

}

}

修改第二个 匹配/images/前缀的location块,使其与请求图像文件的扩展名相匹配:

location ~ \.(gif|jpg|png)$ { root /data/images;

}

该参数是一个正则表达式,匹配以.gif,.jpg或.png结尾的所有URI。 正则表达式应该以~开头。 相应的请求将映射到/data/images目录。

当 Nginx 选择一个location块来处理请求时,它首先检查指定location块的前缀,记住具有最长前缀的location块,然后检查正则表达式。 如果与正则表达式匹配, Nginx 选择此location块,否则,选择先前记住的location块。

代理服务器的最终配置如下:

server { location / { proxy_pass http://localhost:8080/;

} location ~ \.(gif|jpg|png)$ { root /data/images;

}

}

此服务器将过滤以.gif,.jpg或.png结尾的请求,并将它们映射到/data/images目录(通过向root指令的参数添加请求的URI),并将所有其他请求发送给上面配置的代理服务器。

这样,图片和其他请求就可以使用不同的服务器来处理。

FastCGI代理

Nginx 可用于将请求路由到 FastCGI 服务器。快速通用网关接口(Fast Common Gateway

Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。因此 Nginx 可以将请求路由到 FastCGI

运行的应用程序,如 PHP 程序。

使用 FastCGI 服务器的最基本的 Nginx 配置包括使用fastcgi_pass指令而不是proxy_pass指令,以及使用fastcgi_param指令来设置传递给 FastCGI 服务器的参数。 假设FastCGI服务器可在localhost:9000上访问。 以上一节中的代理服务器配置为基础,使用fastcgi_pass指令替换proxy_pass指令,并将参数更改为localhost:9000。 在 PHP 中,SCRIPT_FILENAME参数用于确定脚本名称,而QUERY_STRING参数用于传递请求参数。 生成的配置将是:

server

{ location / { fastcgi_pass localhost:9000; fastcgi_param

SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param

QUERY_STRING $query_string;

} location ~ \.(gif|jpg|png)$ { root /data/images;

}

}

这将设置一个服务器,将路由除静态图像以外的所有请求到运行在localhost:9000的 FastCGI 服务器。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,982评论 0 9
  • 1.简介:  Nginx:engine X ,2002年,开源,商业版 http协议:web服务器(类似于ht...
    尛尛大尹阅读 1,856评论 0 3
  • 1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单...
    rosekissyou阅读 10,178评论 5 124
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,624评论 24 1,002
  • 原文地址:Beginner`s Guide参考文档:Nginx原理本文翻译自上述地址(Nginx官网新手指引),我...
    禾线子阅读 431评论 0 0