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
的内容好了。
<?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/ 目录。好了,修改一下这里。
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 模块的学习。