nginx 基本使用

昨天解决了一个 nginx 的问题,原因是本地配置文件中没指定某域名的访问,此时访问此域名会随机选某个配置文件导致了非预期行为。以前总是觉得这个难以理解,当晚看了一下 nginx 的官方文档,似乎是受到了 enlightenment 一看就明白了。其实他们就是工具,把它们想得简单一点后,并没什么难的。

本文的解释只是基础使用,可参考原文档 Beginner's Guide

简单介绍

nginx 是一种 web server,是内容分发者。就是将过来的请求按配置分发到其他地方。
它有一个主进程和多个工作进程。
主进程负责读和评估配置文件,以及维护工作进程;
工作进程做实际的处理请求工作。
配置文件默认名为 nginx.conf,位置在 /usr/local/nginx/conf, /etc/nginx, 或 /usr/local/etc/nginx 中。(其中的 include 命令可导入多个 server)

运行,停止和重新加载

nginx -s signal

signal 可以为:

  • stop: fast shutdown
  • quit: graceful shutdown
  • reload: reload the configuration file
  • reopen: reopen the log files

配置文件的结构

nginx 的模块(modules)是由 指令 (directives)组成的。
指令分为 简单指令 (simple directives)和 块指令(block directives)。
简单指令 以空格分隔参数,以分号结尾。
块指令 是有大括号({})括住的,且可以嵌套指令。
当块指令嵌套其他指令时,称之为 上下文(context)。例如: eventshttpserverlocation
放在任何上下文之外的指令称之为 主上下文(main context)。
即:
- eventshttp 位于主上下文中
- serverhttp
- locationserver
(可以参考下面的例子)

静态文件的访问

nginx 可以直接将 静态文件请求 指定到某个静态目录下。
例如,服务器上设了两个专门用于放静态文件的目录 /data/www/data/images

http {
    server {
        listen       80;           # 因为是默认端口,本句可省略
        server_name  robin.com; # 监听访问域名

        location / {               # 匹配请求 uri
            root /data/www;        # 设为请求根目录
        }
        location /images/ {
            root /data;
        }
    }
}

解释:

  • 上面的配置监听了请求域名 robin.com80 端口(默认端口),也即当访问 robin.com80 端口时,会走这个配置。
  • location 后面的 //images/ 是 url 匹配,首选最长匹配 进行命中,所以上面的例子中,/ 的 location 一定是最后匹配中的
  • 当命中 /location 时会将 /data/www 设为此请求的根位置。
  • 当请求 url 为 /images/xxx 时,则会命中 /images/,命中后,将 /data作为根目录进行访问。即访问 /data/images/xxx

代理服务器

比如:

  • 我本地起了一个服务挂在本地端口 8080 上,所以用 127.0.0.1:8080 可访问此服务。
  • 但后来我想通过自定义域名来访问。那么可以在文件 /etc/hosts 中加一句 127.0.0.1 robin.com ,此时则可以用 robin.com:8080 来访问。
  • 但我想把端口号也去掉,即通过 robin.com 就访问此服务,这时就需要用到 nginx 的代理功能。
  • 代理服务器,即服务器将请求传入代理服务器,从代理服务器中拿到返回,并返回给客户端。
server {
    server_name robin.com; # 监听域名
    location / {
        proxy_pass http://localhost:8080; # 转到 8080 端口
    }
    location ~ \.(gif|jpg|png)$ { 
        root /data/images;
    }
}

上面例子实现了:

  • 在客户端访问 robin.com 时,将请求重新定位到本机端口 8080 的服务上来,获得结果返回给客户端。
  • 第二个 location 块中, 代表通过正则匹配,此块将以 .gif.jpg.png 结尾的 request 转发到 /data/images/ 的目录下

设置 FastCGI 代理

什么是 FastCGI

首先 CGI 是一种协议,规定了 web server (nginx 就是一种) 传过来的数据格式。FastCGI 是一种更高级的方式,用来提高 CGI 性能的。
比如你想访问一个文件 /icon.png 时,你知道这是个静态文件,可能不会有疑问,但当你要访问的是 /index.php 时呢,如果是静态文件一样的访问,显然不是我们希望的,这时 FastCGI 就用得上了。
当 web server 收到 index.php 的请求后,要启动 CGI 程序,这里就是 PHP 的解析器。接下来,PHP 解析器会解析 php.ini 文件,初始化执行环境,处理请求,再以 CGI 规定的格式返回结果,退出进程。web server 再把结果返回给浏览器。
CGI 针对每个 http 请求都会 fork 一个进程,处理完后,随之退出。进程频繁的启动和退出十分低效。
而 FastCGI 会先 fork 出一个 master,再 fork 出多个 worker,当请求过来时,master 负责分发请求到 worker 上。并且 master 还可以根据配置调节 worker 的多少,在效率和性能间达到平衡。
这里有必要再提一下 php-fpm。它是一个实现了 FastCGI 协议的程序,用来调度 FastCGI 起的进程。

Nginx 的 FastCGI

指令 fastcgi_pass 指定代理的 FastCGI 服务。(与 proxy_pass 并列的一个命令)
指令 fastcgi_param 用来设置传入 FastCGI 的参数。

server {
    location / {
        fastcgi_pass  localhost:9000;       # FastCGI 服务于 9000 端口
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param QUERY_STRING    $query_string;
    }

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

解释:

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

推荐阅读更多精彩内容