用ChatGPT学Nginx是一种什么体验

语言: CN / TW / HK

theme: fancy highlight: atom-one-light


我正在参加「掘金·启航计划」

Hi~,我是一碗周,一个在舒适区垂死挣扎的前端,如果写的文章有幸可以得到你的青睐,万分有幸~~

🦋 写在前面

最近ChatGPT的热度一直不减,那就用ChatGPT来学一学Nginx,看看会有什么样的一个体验。

你问什么是ChatGPT?那就让它自己来告诉你:

image_he1dsxgStd.png

🎉 什么是Nginx?

这个在官网中是什么说的:

NGINX是用于Web服务、反向代理、内容缓存、负载均衡、媒体流传输等场景的开源软件。它最初是一款专为实现最高性能和稳定性而设计的Web服务器。除了HTTP服务器功能以外,NGINX还可用作电子邮件(IMAP、POP3和SMTP)的代理服务器以及HTTP、TCP和UDP服务器的反向代理与负载均衡器。

ChatGPT是什么说的

image_obDGzZ8vsG.png

讲真,说了这么多搞得迷迷糊糊,就记住了Nginx是可以做Web服务器以及反向代理的一个高性能低资源消耗的开源软件就够了。

🌻 优点

image_J7eqOzibyR.png

恩,这个ChatGPT非常强,也不知道在哪里找的数据,不过这也大大减少了自己的学习成本。

🐁 安装

在ChatGPT中问了好几次也没有问道我想要的安装方式,还是自己来吧\~

这里我使用的是源代码编译安装,我的环境:

  • Centos7.9
  • Nginx1.23.3

首先安装用到的工具:

bash yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel wget

然后执行下面这些命令:

bash cd /usr/local mkdir nginx cd nginx/ # 到目标目录 wget http://nginx.org/download/nginx-1.23.3.tar.gz # 下载指定版本 tar -xvf nginx-1.23.3.tar.gz cd nginx-1.23.3/ ./configure --with-http_stub_status_module --with-http_ssl_module # 添加常用模板 make # 编译 make install # 安装

然后查看版本,查看是否安装成功

```bash $ /usr/local/nginx/sbin/nginx -v

nginx version: nginx/1.23.3

```

安装成功之后创建软连接,保证直接可以使用名称访问:

bash ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx

到这为止就安装成功了,其他安装方式可以在Installing nginx中查看。

🥪 Nginx目录

安装完成之后我们先来看一下安装后的Nginx目录结果是个什么样子:

```bash [root@ywanzhou nginx]$ pwd /usr/local/nginx [root@ywanzhou nginx]$ tree . ├── client_body_temp ├── conf # 存放Nginx中配置文件的路径 │ ├── fastcgi.conf # fastcgi相关参数的配置文件 │ ├── fastcgi.conf.default # 以.default结尾的都是同名文件的备份文件 │ ├── fastcgi_params # fastcgi的参数文件 │ ├── fastcgi_params.default │ ├── koi-utf # 编码转换映射文件,用于在输出内容到客户端时,将一种编码转换到另一种编码 │ ├── koi-win # 编码转换映射文件,用于在输出内容到客户端时,将一种编码转换到另一种编码 │ ├── mime.types # 设置http协议的Content-Type与扩展名对应关系 │ ├── mime.types.default │ ├── nginx.conf # 核心配置文件 │ ├── nginx.conf.default │ ├── scgi_params # scgi相关参数文件 │ ├── scgi_params.default │ ├── uwsgi_params # uwsgi相关参数文件 │ ├── uwsgi_params.default │ └── win-utf # 编码转换映射文件,用于在输出内容到客户端时,将一种编码转换到另一种编码 ├── fastcgi_temp # fastcgi临时数据目录 ├── html # nginx中默认的站点目录 │ ├── 50x.html │ └── index.html ├── logs # 日志存放目录 │ ├── access.log # 访问日志 │ ├── error.log # 错误日志 │ └── nginx.pid # nginx启动后,会将pid存入该文件 ├── proxy_temp ├── sbin # nginx命令目录 │ └── nginx ├── scgi_temp └── uwsgi_temp

9 directories, 21 files ```

上面就是对Nginx目录的一个解释。

现在可以尝试一下启动Nginx服务,看看是否有效果,你可以执行下面两个命令之中的一个来启动Nginx:

```bash nginx

或者

systemctl start nginx.service

```

如果想要确定Nginx是否启动,可以通过下面这个命令查看:

```bash [root@ywanzhou ~]$ ps aux | grep nginx # 查看nginx是否启动,如果启动返回结果与下面类似 root 19577 0.0 0.0 46004 1132 ? Ss Feb14 0:00 nginx: master process nginx nobody 19578 0.0 0.1 48536 2228 ? S Feb14 0:00 nginx: worker process root 32259 0.0 0.0 112812 980 pts/0 S+ 09:26 0:00 grep --color=auto nginx

```

OK子,应该就这么多,简答介绍一下目录,下面来介绍一下常用命令。

不对,忘记说了一点,如果想要访问方才启动的Nginx的页面,如果是自己的虚拟机直接把防火墙关了访问ip地址就可以,如果是购买的服务器需要开放80端口才可以访问,访问成功的页面如下:

image_Cy3L103gaN.png

🥑 Nginx的常用命令

现在我们来简单介绍一下Nginx中的常用指令,首先我们来问一下ChatGPT,得到的回复如下:

image_QCwy_p9DHM.png

为了方便大家复制命令,我将上面的内容复制了一份。

以下是一些常用的Nginx指令:

  1. nginx:启动Nginx服务器。
  2. nginx -s stop:停止正在运行的Nginx服务器。
  3. nginx -s quit:优雅地停止Nginx服务器。
  4. nginx -s reload:重新加载Nginx配置文件,无需停止服务器。
  5. nginx -t:检查Nginx配置文件的语法是否正确。
  6. nginx -V:显示Nginx版本和编译选项信息。
  7. nginx -h:显示Nginx的命令行选项。
  8. sudo systemctl start nginx:在Linux上使用systemd启动Nginx。
  9. sudo systemctl stop nginx:在Linux上使用systemd停止Nginx。
  10. sudo systemctl restart nginx:在Linux上使用systemd重新启动Nginx。

我这里简单的总结了一张图,如下所示:

Nginx常用命令_N0GRAoCmsd.png

🐬 Nginx配置文件

Nginx的配置文件这里通常指的的./conf/nginx.conf文件,下面就是Nginx中的默认的配置文件:

```nginx

user nobody; # 指定用户使用nginx

worker_processes 1; # nginx工作进程数,一般与cpu核数相同

error_log logs/error.log; # 日志存放目录

error_log logs/error.log notice;

error_log logs/error.log info;

pid logs/nginx.pid; # nginx的pid存放目录

events { worker_connections 1024; # 每个进程允许的最大连接数 }

http { include 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        on;
#tcp_nopush     on;

#keepalive_timeout  0;
keepalive_timeout  65;

#gzip  on;

server {
    # 一些配置文件
}

}

```

上面是Nginx配置文件中的一部分,想要学习Nginx配置文件,首先我们先来了解一下Nginx配置文件的语法:

🐋 配置文件语法

  1. 注释:在Nginx的配置文件中,注释以#开头;
  2. 指令:说的是Nginx服务器如何处理请求的规则,每个指令都要以一个分号;结尾,它可以包含一个或者多个参数,例如: ```nginx include mime.types; # 引入其他的配置文件 worker_processes 1; # nginx工作进程数,一般与cpu核数相同

    指令和参数中间以空格分割,空格的数量没有要求。 3. 指令块:类似于JavaScript中的代码块,由一对`{}`进行包裹,例如:nginx events { worker_connections 1024; # 每个进程允许的最大连接数 } http { include mime.types; # 引入其他的配置文件 default_type application/octet-stream; }

    `` 4. 变量:Nginx中的变量的格式为$variable_name`,具体Nginx中包含什么变量,以及变量的具体含义后面在进行解释。

🦄 全局配置

首先我们先来说一下Nginx中的全局配置,也就是:userworker_processeserror_logpid这四个配置,这四个配置理解起来很容易,如下所示:

  • user:用于设置Nginx服务所使用的用户;
  • worker_processes:用于设置Nginx服务器的进程数量,通常与CPU的核数一致,设置少了服务器的性能没有充分利用,设置多了造成没有必要的进程切换;
  • error_log:Nginx错误日志的存放路径;
  • pid:Nginx服务所启动时的pid。

🍞 events指令块

在Nginx中的配置文件中,events指令块用来定义用来定义事件模型和每个进程的最大连接数量,例如默认的例子中:

nginx events { worker_connections 1024; # 每个进程允许的最大连接数 }

worker_connections的指令就指定了每个进程允许连接的最大并发数量。

除此之外,events指令块还具有以下的其他参数:

  • multi_accept:允许每个worker进程一次性接收多个新连接,默认为off。
  • accept_mutex:允许多个worker进程争抢新连接,默认为on。
  • accept_mutex_delay:设置worker进程获取accept_mutex的超时时间,默认为500毫秒。
  • use:指定Nginx使用的事件模型,支持selectpollepollkqueue等。默认值取决于操作系统类型和版本,建议让系统自行选择。

🥦 http指令块

http指令块是Nginx配置文件中最重要的一个配置,它用于配置Nginx作为服务器的一些行为。

它的语法如下所示:

```nginx http { include 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        on;
#tcp_nopush     on;

#keepalive_timeout  0;
keepalive_timeout  65;

#gzip  on;

server {
    # 一些 server 块的配置
}

} ```

http指令块可以分为两个部分,一个是全局性的指令配置,另一个是server指令块(可以包含多个),这里我们就先了解一下http指令块中的全局性的指令配置,关于server指令块我们在下一部分看。

http配置块中,还可以定义一些全局性的配置指令,如下所示:

  • include: 包含其他的配置文件;
  • types:定义文件扩展名和对应的Content-Type;
  • default_type:定义默认的Content-Type类型,默认为default_type text/plain
  • access_log:指定Nginx的访问日志文件路径;
  • sendfile:指定Nginx是否启用sendfile指令进行高效的文件传输,默认为on;
  • tcp_nopush:指定Nginx是否启用tcp_nopush指令进行数据推送,默认为off;
  • keepalive_timeout:指定Nginx与客户端保持连接的超时时间,默认为75秒;
  • gzip:控制是否对响应内容进行gzip压缩;
  • server:定义一个HTTP服务器。

🐏 server指令块

server指令块用于配置一个HTTP服务器,每一个HTTP服务器都表示一个虚拟主机,用于监听HTTP请求,并将接收的请求分发到location指令块进行处理

一个http指令块可以包含多个server指令块,一个server指令块可以包含多个location指令块,实例如下所示:

```nginx server { listen 80; server_name localhost;

#charset koi8-r;

#access_log  logs/host.access.log  main;

location / {
    root   html;
    index  index.html index.htm;
}
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   html;
}

} ```

我们依次来看:

  • listen:用于指定虚拟主机监听的IP地址和端口,它是支持多个的;
  • server_name:用于指定虚拟主机的域名/IP,支持通配符和正则表达式,可以配置多个,以空格分割;以下是一些例子: nginx server_name www.ywanzhou.com; # 精确匹配 server_name *.ywanzhou.com; # 通配符 可以匹配 test.ywanzhou.com blog.ywanzhou.com等 server_name ^www\.(\w)\.com$; # 正则,可以匹配www.*.com的域名 # 匹配顺序是 精确 通配符 正则
  • charset:字符集;
  • access_log:用于配置访问日志的文件路径。 nginx access_log logs/host.access.log main # 将访问日志存放进logs/host.access.log日志格式为 main ,也就是http指令块中log_format指令指定的格式
  • location:指令块用于配置URL与资源的映射关系,它支持正则,非常的强大,这里就简单介绍一下,后面在详细的说。
    • root:用于指定虚拟主机的根目录,即请求的URL对应的文件在服务器中的存储路径。
    • index:用于指定默认访问的文件名,如果用户访问的URL路径不包含文件名,则会默认访问该指令设置的文件。
  • error_page:该指令用于定义HTTP错误页面的处理方式,简单说就是当我们访问的页面不存在时,我们可以通过error_page指令来指定错误页面,就拿下面这个例子来说: nginx error_page 500 502 503 504 /50x.html; 其中的500 502 503 504表示状态码,如果出现这些跳转到对应的页面,而/50x.html是指定的目标URL。

🌸 Nginx的执行流程

最后我们来了解一下Nginx接收到请求后的一个执行流程,从客户端发送请求到Nginx返回响应体大致为以下几个步骤:

nginx请求处理流程 (1)_sv6xXFc6z8.png

  • 解析请求:当Nginx接收到一个请求时,会首先解析该请求的头部信息,包括请求方法、请求URI、HTTP版本、请求头部等等;
  • 确定server块:根据上一步解析的信息,确定该请求应该交给哪个server块进行处理;
  • 确定location块:根据URL去寻找对应的location块,如果没有找到则使用默认的location块进行处理。
  • 处理请求:根据选择的location块中的配置,对请求进行处理。可能的处理方式包括反向代理、重定向、文件读取、CGI脚本执行等等。
  • 响应体处理:根据请求的内容去返回不同的内容:
    • 如果是动态请求Nginx则会将请求进行转发;
    • 如果是静态资源则会根据配置的静态资源目录进行查找;
    • 如果缓存中存在则会从缓存中返回;
    • 如果请求存在问题,则会返回对应的错误页面;
  • 返回响应:Nginx将处理结果返回给客户端,包括响应头部、响应状态码、响应内容等信息。

💫 写在最后

这篇文章介绍的几乎都是Nginx中的概念问题,还是比较枯燥的,用了很大的篇幅来介绍Nginx中的配置文件,可以用作参考

这篇文章是《前端&运维那点事儿》专栏中Nginx系列的第一篇文章,后面还会有几篇文章继续来玩Nginx。

如果对这个专栏感兴趣可以点一个关注,会一直持续更新\~