nginx 基本使用

2018-12-27  本文已影响1人  Robin92

昨天解决了一个 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 可以为:

配置文件的结构

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;
        }
    }
}

解释:

代理服务器

比如:

server {
    server_name robin.com; # 监听域名
    location / {
        proxy_pass http://localhost:8080; # 转到 8080 端口
    }
    location ~ \.(gif|jpg|png)$ { 
        root /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;
    }
}

解释:

上一篇下一篇

猜你喜欢

热点阅读