Nginx 原理解析和配置摘要

摘要:
此外,Nginx使用异步非阻塞方法处理请求,避免了CPU闲置,这是其高性能的主要原因。此外,Nginx模块是静态编译的,并在启动后自动加载。

前言

Nginx 作为高性能的 http 服务器,知名度不必多言,相似产品中无出其右。本篇随笔记录我认为较为重要的原理和配置。
Nginx 原理解析和配置摘要第1张

1. 原理解析

1.1 结构

Nginx 原理解析和配置摘要第2张
以上是 Nginx 的结构图,其包含一个 master 和 n 个 worker,master_processes 用于外部通信和统一管理其下 worker_processes ,因此可以做到重启时不中断服务。另外,Nginx 采用了异步非阻塞的方式来处理请求,避免了 cpu 闲置,这是其高性能的主要原由。

1.2 模块

Nginx 从功能上可分为以下三大类:

  • Handlers(处理器模块):用于直接处理请求,并进行输出内容和修改 headers 信息等操作,一般只能有一个。

  • Filters(过滤器模块):主要对处理器模块输出的内容进行修改操作,然后输出。

  • Proxies(代理模块):主要是 upstream 模块,与后端一些服务比如 FastCGI 等进行交互,实现服务代理和负载均衡等功能。

1.3 工作流程

Nginx 原理解析和配置摘要第3张
上图是 Nginx 常规的 HTTP 请求和响应过程,当接到请求时,通过查找配置文件将其映射到一个 location block,并按照其中所配置的各个指令,启动不同的模块去完成工作。通常一个 location 中的指令会涉及一个
handler 模块和多个 filter 模块。另外,Nginx 的模块属于静态编译方式,在启动后自动加载。

2. 配置摘要

Nginx 对于我来说最常规的运用就是静态资源处理和反向代理,因此我只记录这些相关的配置。Nginx 配置一般分为三部分:global、events 和 http,通用基本配置一般保存在 /etc/nginx/nginx.conf 文件中,具体的服务配置一般保存在 /etc/nginx/conf.d/ 文件夹下。

2.1 Global 和 Events 配置

一般在 nginx.conf 配置文件的开头位置设置一些与具体业务无关的参数,如下:

user  nginx; # 用户或者用户组
worker_processes  2; # worker 进程数,一般与服务器的虚拟内核数相等

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

Events 中需要自行调整的就一个必要参数:worker_connections,这个数值涉及到最大连接数的计算,即:

# nginx 作为 http 服务器的时候:
max_clients = worker_processes * worker_connections

# nginx作为反向代理服务器的时候:
max_clients = worker_processes * worker_connections/4

当然这个最大连接数还与系统可打开的最大文件数有关,max_clients 必须要小于 file-max(cat /proc/sys/fs/file-max),我的配置:

events {
    worker_connections  2048;
}

2.2 http 服务器配置

2.2.1 全局配置

一般情况下虚拟主机以外的配置保持默认就行了,如:gzip 压缩,ip 获取等一般都交给云服务器的负载均衡处理了,写一下默认值吧:

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

2.2.2 server 虚拟主机配置

真正的与业务相关的配置都在这个小节,顺着流程来讲吧。现在不论是公司站还是个人站都应该普及了 https 了吧(运营商的 http 劫持实在太流氓了,特别是手机端的 web,再强调一遍,流氓,流氓...),这里面涉及到一个 https 强制跳转问题,可以让负载均衡的 80 端口来监听服务器的 81 端口进行重定向:

server {
    listen   81;
    return   301 https://$host$request_uri;
}

如果是静态网页相关的配置,可以参考default.conf

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Nginx 更多的情况是用作反向代理:

server
{
    listen 80;
    server_name x.youclk.com;
    location / {
        proxy_pass http://x;
        # Proxy Settings
        # proxy_redirect     off;
        # proxy_set_header   Host             $host;
        # proxy_set_header   X-Real-IP        $remote_addr;
        # proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
}

server
{
    listen 80;
    server_name y.youclk.com;
    location / {
        proxy_pass http://y;
    }
}

3. 命令摘要

没啥好说的,不做特殊用途的话以下命令能够满足操作了:

service nginx {start|stop|status|restart|reload|configtest}

结语

本篇随笔可以说是 Nginx 的一些基本摘要,使用和原理方面都没有深入探究,后续如果使用到更高级功能或者有新的应用场景,再来继续补充内容。


我的公众号《有刻》,我们共同成长!
Nginx 原理解析和配置摘要第4张

免责声明:文章转载自《Nginx 原理解析和配置摘要》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇loadrunner性能测试——入门表单操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

用C#写了个日志类

日志的作用我想不必我多说了,在做BS架构的程序的时候,我们通常会把日志写在数据库的某张表中,这样带来的好处是便于查询,使用SQL语句十分方便而灵活,但缺点也是显而易见的,那就是造成数据库负担过重,随着日志不断增加,表的尺寸也会变得越来越庞大,性能也会渐渐下降,所以我打算把日志保存到文本文件中去,纯文本文件的写入可是要比数据库快很多的。 然而目前已经存在的日...

HTTP 499状态码 nginx下499错误详解-乾颐堂

  日志记录中HTTP状态码出现499错误有多种情况,我遇到的一种情况是nginx反代到一个永远打不开的后端,就这样了,日志状态记录是499、发送字节数是0。   老是有用户反映网站系统时好时坏,因为线上的产品很长时间没有修改,所以前端程序的问题基本上可以排除,于是就想着是Get方式调用的接口不稳定,问了相关人员,说没有问题,为了拿到确切证据,于是我问相关...

Android画图并保存图片(转载)

Canvas是一个画布,你可以建立一个空白的画布,就直接new一个Canvas对象,不需要参数。 也可以先使用BitmapFactory创建一个Bitmap对象,作为新的Canvas对象的参数,也就是说这个画布不是空白的, 如果你想保存图片的话,最好是Bitmap是一个新的,而不是从某个文件中读入进来的,或者是Drawable对象。   然后使用Canva...

Nginx 对客户端请求的限制

本文记录一下Nginx静态web服务器对客户端请求限制的配置项。 1)按HTTP方法名限制请求 语法:limit_except method... {...} 配置块:location Nginx可以通过该配置来限制客户端请求,可以取值为GET、HEAD、POST、PUT、DELETE、MKCOL、COPY、MOVE、OPTIONS、PROPFIND、PR...

Nginx Session Sticky

nginx的粘性session主要通过nginx-sticky-module实现 1下载nginx-sticky-module 下载地址:https://code.google.com/p/nginx-sticky-module/downloads/list 官方文档:https://code.google.com/p/nginx-sticky-modul...

使用SQLAlchemy操作已存在的数据库的表

需求场景: 使用sqlalchmy从现有的表中获取数据(不是自己建表)。百度了一下,网上都是使用sqlalchemy自己先创建表,然后导入数据表的模型类进行增删改查;现在不是自己建表,该如何操作呢? 操作方案 通过sqlalchmey执行原生的sql语句,增删改查的原生语句携带表名,就不需要导入数据表的模型类了。 使用的包: SQLAlchemy (1.3...