Nginx入门

简介

以下是摘自官方的介绍:

Nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server.

Nginx是engine x的缩写,它是一款HTTP服务器,也是反向代理服务器,还能当邮件代理服务器,以及通用TCP/UDP代理服务器。

基本用法

使用Nginx之前,需要了解几个基本的命令:

# 发送命令(-s signal)
nginx -s

#打开 nginx
nginx

#测试配置文件是否有语法错误
nginx -t

#重启Nginx
nginx -s reopen
 
#重新加载Nginx配置文件,然后以优雅的方式重启Nginx
nginx -s reload

#强制停止Nginx服务
nginx -s stop

#优雅地停止Nginx服务(即处理完所有请求后再停止服务)
nginx -s quit

Nginx的核心是其配置文件——nginx.conf,一般位于/etc/nginx/(这也是其他配置文件的目录)。要使用Nginx,首先必须要掌握nginx.conf相关内容。

nginx.conf配置文件主要由三大部分构成:1、主上下文(main context)配置;2、events配置块;3、http配置块。

主上下文配置

# user user [group];定义工作进程认可的用户和用户组。
user html;

# worker_processes number | auto;定义工作进程数。
worker_processes  1;

# error_log file [level];定义默认的错误日志文件。level可以是debug, info, notice, warn, error, crit, alert, emerg。
error_log  logs/error.log;

# 定义记录主进程ID的文件。
pid        logs/nginx.pid;

# 定义Nginx是否作为守护进程。主要用于开发阶段。
daemon on | off;

# 向当前配置文件引入另一个file文件,或者是满足mask的文件。引入的文件需要保证指令和块的正确性。
include file | mask;

更多主上下文配置,请参考官方提供的核心功能列表

events配置块

events {
    # 定义工作进程可以同时打开的最大连接数。
    worker_connections  1024;
}

events配置块主要用于设置与连接进程相关的命令。

更多events配置块的配置,请参考官方提供的核心功能列表中,Context为events的命令。

HTTP配置块

以Nginx默认配置为例,下面配置注释简单解释了HTTP配置块的主要组成部分。

http {
    # 导入mime.types文件。mime.types中定义了各种类型的媒体格式。
    include       mime.types;
    # 定义响应的默认mime格式。可以通过查看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  logs/access.log  main;
    # 定义是否使用sendfile()方法传输文件。
    # 它在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称为零拷贝。
    sendfile        on;
    # 定义是和否调用TCP_NOPUSH/TCP_CORK。该配置当且仅当sendfile开启时生效。
    tcp_nopush     on;
    #  keepalive_timeout timeout [header_timeout];定义客户端连接的存活时间,如果timeout=0,则禁止客户端存活(keep alive)。
    # 第二个参数设置的是header里的属性。
    keepalive_timeout  65;
    # 定义是否开启gzip的响应
    gzip  on;
    # server块配置
    server {...}
}

HTTP配置块主要用于配置HTTP服务器相关的指令。该块包括全局变量,server配置块两个部分。其中,server配置块还包括location配置块。

下面是官方文档对server块的定义:

Sets configuration for a virtual server. There is no clear separation between IP-based (based on the IP address) and name-based (based on the “Host” request header field) virtual servers. Instead, the listen directives describe all addresses and ports that should accept connections for the server, and the server_name directive lists all server names. Example configurations are provided in the “How nginx processes a request” document.

server配置块主要作用是配置了一台虚拟服务器。至于是基于Ip地址还是基于服务器名并没有明确的界限。其中listen指令表示该虚拟服务器需要匹配的Ip地址和端口;server_name指令表示该虚拟服务器需要匹配的服务器名。配置示例可以参考《How nginx processes a request》

这里需要指出两点,也是《How nginx processes a request》一文中有解释的:

  1. 当listen中同时配置了Ip地址和端口,同时还配置了server_name,Nginx会优先匹配Ip地址和端口。
  2. 当Ip地址和端口匹配,但是不存在对应的server_name时,第一个server配置块是默认的配置。

更多HTTP配置块的配置,请参考官方提供的HTTP核心配置列表,以及官方文档Modules reference部分以ngx_http_开头的配置。

Nginx的特点

Nginx主要有以下四个功能/特点:

  1. 反向代理
  2. 动静分离
  3. 负载均衡
  4. 高可用

下面,就以上几个方面进行Nginx入门介绍。

反向代理

个人理解,正向代理还是反向代理的区别在于代理对象。正向代理的代理对象是客户端(即隐藏真实客户),反向代理的代理对象是服务端(即隐藏真实提供商)。

之前看到一个有趣的例子:

正向代理:甲想向丙借钱,但是甲和丙有矛盾,甲通过乙向丙借到了钱。此时,乙是甲的代理,丙不知道是甲借钱。

反向代理:甲向乙借钱,乙知道丙有很多钱,于是乙借了丙的钱给甲。此时,乙是丙的代理,甲不知道丙。

通过上面简单描述,如何使用Nginx配置反向代理就简单明了了。只需配置好server配置块即可。例:

server {
    location / {
        proxy_pass http://remote:8080/;
    }
}

此例中,当客户端请求根目录时,将被反向代理至http://remote:8080/,即Nginx知道http://remote:8080/这儿有很多钱。

动静分离

个人理解,动静分离的“动”类似jsp需要服务端处理,“静”类似image可以直接读取。因此实现动静分离可以理解为在反向代理的基础上,把静态资源放在本地。例:

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

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

此例中,当客户端请求根目录时,将会被反向代理至http://localhost:8080/。当然,这个地址可以是远程服务器地址。当客户端请求图片时,将会直接去/data/images中查找图片。

负载均衡

负载均衡,简单理解,一万块钱以某种方式平均分给多个人用。

在Nginx中,提供有以下几种“分钱”的方式:

  • round-robin — requests to the application servers are distributed in a round-robin fashion,
  • least-connected — next request is assigned to the server with the least number of active connections,
  • ip-hash — a hash-function is used to determine what server should be selected for the next request (based on the client’s IP address).
  1. 轮询方式——默认负载均衡算法。按配置中的虚拟服务器顺序依次请求。
  2. 最少连接——下一次请求会被分配到最少活跃连接数的虚拟服务器上。
  3. IP哈希——基于客户端的Ip地址进行哈希运算,该客户端的请求每次都会被分配到指定的虚拟服务器上。
  4. 加权——每个虚拟服务器会有一定占比,客户端的请求会依据占比被分配到虚拟服务器上。

配置Nginx负载均衡的关键是在HTTP配置块中添加upstream配置块,例:

http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}

此例中,客户端的请求会按默认的负载均衡算法(即轮询)分配到srv1,srv2,srv3三台虚拟服务器上。

至于,如何配置不同的负载均衡算法,其实挺简单。例:

upstream myapp1 {
        # least_conn/ip_hash;
        server srv1.example.com weight=3;
        server srv2.example.com;
        server srv3.example.com;
    }

此例中,使用加权的方式。如果需要使用最少连接,或者Ip哈希的方式,只要在注释处配置即可。

更多负载均衡相关配置,请参考官方提供的文档《Using nginx as HTTP load balancer》。

高可用

现如今,云环境已经十分普及。要想实现高可用,Nginx必须克服自身的单点故障。据了解,目前较为成熟的方案是Nginx结Keepalived实现。其中,Keepalived只需安装,然后配置keepalived.conf即可。这并非本文重点,因此请读者自行查阅相关资料。

总结

千里之行,始于足下。

参考资料

  1. Nginx官方文档
  2. 尚硅谷Nginx教程
  3. Nginx程序
 
本文内容转自冰部落,仅供学习交流,版权归原作者所有,如涉及侵权,请联系删除。

声明:
本平台/个人所提供的关于股票的信息、分析和讨论,仅供投资者进行研究和参考之用。
我们不对任何股票进行明确的买入或卖出推荐。
投资者在做出投资决策时,应自行进行充分的研究和分析,并谨慎评估自己的风险承受能力和投资目标。
投资有风险,入市需谨慎。请投资者根据自身的判断和风险承受能力,自主决策,理性投资。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注