【Nginx04】Nginx学习:HTTP核心模块(一)简单搭建

2023-09-07 09:04:40 浏览数 (1)

Nginx学习:HTTP核心模块(一)简单搭建

前面就说过了,HTTP 模块是整个 Nginx 中最核心的模块。在这其中,它又有一部分最核心的模块,其实也就是在编译安装的时候,我们不装任何扩展就自带的模块。这一部分模块就像是基本的 PHP 语法一样,是最基础的,也是我们最需要重点掌握的内容。

今天先入个门,搭起简单的一套 Web 服务,让 Nginx 可用就行了。内容不复杂,但如果是初学者,那一定要跟着动手练练哦。即使是做了几年的老油条了,如果你对 Nginx 也仅限于 宝塔 之类的面板配置的话,那也最好一起动手玩玩哦。

HTTP模块

在 Nginx 中,除了核心模块之外,其它模块之间的划分就是通过命令标识与一对花括号来体现的,我们上回学习到的事件模块就是在 events 中进行配置。其实很像我们在编程语言中的作用域的感觉。比如在 HTTP 模块中,所有的配置指令都是在下面这个 http 指令模块中。

代码语言:javascript复制
http { ... }

它就是为HTTP服务器提供配置上下文的,后续我们要学习的所有和 HTTP 相关的配置指令都是在这个 http 下面进行配置的。也就是说,马上要学习的内容,基本全是在这个 http 内部的配置指令。

今天是第一篇,所以咱们还是先搭起来一个简单的服务器。

简单搭建起来一个服务器

只需要写下下面这些配置,就可以运行起来一个标准的 Web HTTP 静态服务器了。

代码语言:javascript复制
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

这个配置其实就是我通过 cat nginx.conf.default | grep -Ev '^$|#' 去除掉 nginx.conf.default 这自带的默认配置文件的注释和空格所得到的结果。我们可以把这部分内容保存到另一个文件中,比如我就起名为 nginx.conf-first.conf 。

接下来,关闭正在运行的 Nginx ,还记得之前命令行学过的内容吧。

代码语言:javascript复制
nginx -s quit

然后使用我们这个新的配置文件来启动。

代码语言:javascript复制
nginx -c /etc/nginx/nginx.conf-first.conf

为啥不直接用自带的原始的那个 nginx.conf 文件呢?其实如果是刚装好的 Nginx ,那么 nginx.conf 文件和上面的配置内容是一模一样的,只是有注释而已。用默认的 nginx.conf 文件也可以,但是在写文章的时候我对那个默认的配置文件已经做了很多更改,所以暂时我不想动它。正好也顺便复习一下之前学习的命令行相关的内容嘛。同时也证明一下,启动 nginx 的时候,具体使用哪个配置文件是我们可以自己指定的,就像 Reids 那些一样。

好了,现在我们使用的就是这个新的配置文件了。大家可以访问一下试试。

基本模块

在 http 中,最基础的就是 server 模块,它代表一个虚拟主机,下篇文章我们就来重点介绍它。在 http 中,一定要有一个虚拟主机,要不就不知道访问谁了。

另一个就是 location 模块,它其实是在 server 之下的,用于指定路径的访问。一般最少都会有一个 location / 的配置,这一部分内容我们将在下下篇文章学习,也就是讲完 Server 之后。

这两块是 Http 模块中最重要的两部分内容。

return 指令

这个指令是属于重写 Rewrite 模块的,不在 HTTP 的核心模块中,未来我们学习到相关的模块时才会详细的学习,这里先只是简单的介绍一下,因为它对于我们的调试非常有用。

代码语言:javascript复制
………………
location / {
  root   html;
  index  index.html index.htm;
}
location /t1 {
 return 201 'return test!';
}
………………

location / 后面添加一个访问路径 /t1,在这个路径里面我们就使用了 return 指令。这个指令的参数可以指定一个 HTTP 状态码,后面可以可选地返回一个文本内容或 URL 链接。对于调试来说,我们可能会更多地使用文本内容。

现在大家需要重载服务配置,这回可不能直接就 nginx -s reload 了,需要把配置文件参数也带上 nginx -c /etc/nginx/nginx.conf-first.conf -s reload 。不带会怎样?大家自己试试呗。然后就可以访问上面配置的链接,看看状态码是不是 201 ,响应体输出的内容是不是 return test! 。

连接 PHP

这个连接 PHP 的配置,对于我们大部分 PHPer 来说应该非常熟悉了。但对于使用其它语言的,可能会用得比较少。其实这套配置在默认的 nginx.conf.default 和 nginx.conf 中已经给出了。我们复制过来就好。

代码语言:javascript复制
location ~ .php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    include        fastcgi_params;
}

这个 location 使用了正则,后面学习的时候再详细说,意思就是所有以 .php 结尾的文件,走这个 location 。在这里,我们需要先修改一个地方,就是 fastcgi_pass ,表示连接 PHP-FPM 的方式。之前在 了解PHP-FPMhttps://mp.weixin.qq.com/s/NUpDnfYfbPuWmal4Am3lsg 这篇文章中我们就已经介绍过了 UnixSocket 和 TCP 两种连接方式的区别。因此,要根据你在当前服务器上安装的 PHP-FPM 的配置来进行配置。比如我这里使用的就是 UnixSocket 方式,sock 文件在 /var/sock/php-fpm/www.sock 。因此,最终的配置就是修改一下这里。

代码语言:javascript复制
location ~ .php$ {
    …………
    fastcgi_pass   unix:/var/sock/php-fpm/www.sock;
    …………
}

接下来,在程序安装目录的 html 目录下新建一个 script 目录(我这里是 /usr/local/nginx/html ),里面放一个 1.php 文件,文件内容就简单地打印一个 $_SERVER 的内容好了。

代码语言:javascript复制
<?php
print_r($_SERVER);

现在访问一下 /1.php ,不对呀,File not found. 错误出现了。这是啥情况?其实呀,还有一个地方被我们忽略了,那就是 fastcgi_param SCRIPT_FILENAME 这一行,默认它是 /scripts/fastcgi_script_name。表示的是 FastCGI的脚本目录是 /scripts 目录下的文件,fastcgi_script_name 是一个 Nginx 变量,表示的是具体的脚本名称,也就是 1.php 。合起来的话,就是让 FastCGI 去执行 /srcipts/1.php 这个文件。很明显,这个文件不存在呀,我们创建的文件路径应该是 /usr/local/nginx/html/scripts/1.php 嘛。

这里的修改其实很简单,再加一个变量 $document_root ,它会获得 root 配置所指定的目录的绝对路径,即使我们在上面的配置中指定的 root 是一个相对路径,它也会返回完整的 /usr/local/nginx/ 目录。好了,修改一下这里。

代码语言:javascript复制
location ~ .php$ {
    …………
    fastcgi_param  SCRIPT_FILENAME  $document_root/scripts$fastcgi_script_name;
    …………
}

现在重载配置之后再访问一下,看看是不是正常显示 PHP 输出的内容了。

目录权限问题

前面的测试,不管添加的文件,还是 html 这个目录,权限全是 root 用户的,并且文件权限也只有 644 。但是大家在日常使用时,更喜欢将 Nginx 的项目根目录设置为 www 或者 nginx 之类的用户,也就是跟我们在 Nginx 设置的 user 配置中使用相同的用户。其实这么做是对的,但是,并不是说一定要这个指定的用户才能运行。Nginx 运行静态或者动态文件,只需要所有父目录为755权限,文件为 644 权限就可以了。或者换句话说,只要有 r 这个读权限就可以。但是,这种权限如果都是 root 用户的话,那么 www 之类的用户就没法写入,而且目录用户给的确实太大。做为标准开发的话,通常还是会改成 www 之类的标准用户。

当然,这个用户名不是完全一定要用 www 之类的,你完全可以指定自己喜欢的用户名,不过需要注意的是要设置成 nologin 的,而且 Nginx 和 PHP-FPM 都要配置成一样的。这样才能避免因为权限而产生的各种问题。

总结

比较简单吧?非常入门。但是对于纯入门的新手来说可能也会比较懵圈,另外我也没讲过 Nginx 的安装,这一部分的内容大家可以在网上搜搜,不管是视频还是文章,简直不要太多了。推荐的还是手动编译安装一下,将来学完了日常在工作中不管是 yum 还是面板工具之类的都没问题。但是打基础阶段还是用笨方法吧。

好了,接下来就进入到我们第一个非常核心的部分,那就是 Server 模块的学习。

0 人点赞