美文网首页
nginx 基本使用

nginx 基本使用

作者: Robin92 | 来源:发表于2018-12-27 20:55 被阅读1次

    昨天解决了一个 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 参数。

    相关文章

      网友评论

          本文标题:nginx 基本使用

          本文链接:https://www.haomeiwen.com/subject/icallqtx.html