欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

宁皓网 NGINX:Web 服务器 有大用 有大大用

1) 安装 NGINX

我在本地创建了一台 CentOS 系统的虚拟机,在上面可以先安装一下 NGINX 这个 Web 服务器。先给它添加一个仓库 ... 位置是 /etc/yum.repos.d/nginx.repo ... 我用的是 rmate 这个小工具,它可以直接让我们在本地的编辑器上直接编辑在远程主机上的文件 ... 方法可以在宁皓网的 Atom 编辑器这个课程里找到。

仓库是 nginx ... 名字是 nginx rpeo ... baseurl 基本的地址是 .. http://nginx.org/packages/mainline/centos/7/$basearch/

不检查 gpg ... 状态是启用 ..

保存 .. 再用 yum 安装一下 nginx ..

完成以后,启动一下它 ... systemctl start nginx

再让它可以开机自启动 ..systemctl enable nginx

查看一下这台服务器的 ip 地址 ... 复制一下 ...

然后直接在浏览器上 ... 请求访问一下这个 ip 地址 ... 一切正常,会显示一个 nginx 的欢迎界面 ..

rmate 编辑远程文件

image.png

image.png

安装

image.png

启动 和 开机自启动

image.png

查看 ip 地址

image.png


来自 https://ninghao.net/video/3998#info



全局

2)全局配置

NGINX 的相关配置文件一般是在 /etc/nginx 这个目录下面 ... 你可以直接使用系统上的编辑器编辑这里的东西 .. 如果你用的是 macOS 可以把这个目录挂载到本地的某个位置上,这样你就可以直接使用本地的编辑器去编辑这些文件了 ..

我当时的位置是用户的桌面 .. 在这里创建一个新的目录,名字是 nginx .. 再用提前安装配置好的 osxfuse 跟 sshfs ,去挂载服务器的某个目录到这个地方 .. 服务器上的目录是 /etc/nginx .. 本地的位置是 /Users/wanghao/desktop/nginx ..

输入密码 .. 再用本地的 Atom 编辑器打开这个目录 .. 这里出现的就是远程主机上的 /etc/nginx 下面的东西 ..

这里的 nginx.conf 是 nginx 的主要的配置文件 ... 配置文件里会设置一些区域 .. 然后使用 nginx 模块里的一些指令去配置我们的 web 服务器。

这个 user 指令,设置的是运行 nginx 的用户还有用户组 .. 不单独指定用户组的话会使用用户的名字 .. 想设置群组,可以在用户的后面加上一个空格,然后再输入群组的名字 ... user 的值是 nginx ,意思就是远行 nginx 的 worker 进程的用户还有群组应该就是这里设置的 nginx 。

worker_processes 设置的是工作进程的数量,工作进程是接待用户用的 .. 现在它的值是 1 ,你可以根据自己的服务器的情况去设置这个进程的数量,一般你的服务器 CPU 有几个核心,就可以把这个工作进程设置成几 ..

error_log ,是错误日志所在的位置,你可以别的地方也可以使用这个指令去设置错误日志的位置,这里设置的是一个全局的错误日志的位置,后面还有个参数,它的值现在是 warn,这个参数是错误日志的几个级别,比如可以是 debug,info,notice,warn,error 等等 ... 如果你想记录 debug 这个级别的错误,在编译 nginx 的时候,需要加上 --with-debug ..

debug, info, notice, warn, error, crit, alert, and emerg

pid,这个指令设置的是保存主进程的进程 ID 的那个文件所在的位置 ..

下面是一个 events 区域,这个区域里的东西应该是跟连接有关的一些指令 .. 现在它里面有一个 worker_connections 指令 .. 它设置的是一个工作进程同时可以接受的连接的数量 ...

http://nginx.org/en/docs/ngx_core_module.html#user
http://nginx.org/en/docs/ngx_core_module.html#worker_processes
http://nginx.org/en/docs/ngx_core_module.html#error_log
http://nginx.org/en/docs/ngx_core_module.html#pid

查看当前目录 创建 nginx 目录,挂载服务器的目录到本地 然后使用atom打开这个目录

image.png

nginx.conf 文件

image.png

来自 https://ninghao.net/video/4000#toc

3)http 

这个主配置文件里还有一个 http 区域 ... 这个区域下面的配置是跟 NGINX 的 http 模块相关的。

它里面的这个 include 指令,可能把其它的配置文件包含进来,这个指令的值就是这些配置文件的位置 ...

这条指令把 /etc/nginx/mime.types 这个文件包含到了这个配置文件里 .. 这个 mime types 的功能就是告诉浏览器什么样的文件是什么类型的 .. 这样浏览器就会知道怎么样去处理这些文件 ..

下面的 default_type,设置了一种默认的类型 ... application/octet-stream ,是二进制的文件 .. 也就是如果在 mime.types 里面没有列出文件的类型,浏览器会把这些文件当成二进制的文件来处理 ..

log_format,是 http log module 提供的功能,它设置的是日志记录的格式,这个 main 是名字,后面的一大串东西就是每条日志的格式,里面用了一些变量,表示的就是访问相关的一些东西 ... access_log,指定了访问日志的位置。

sendfile,是一种优化过的传输数据的方法 ... 这个 sendfile 指令可以控制是不是要使用这种方法传输数据 .. 默认是 on ,表示要使用这种方法 .. 把它设置成 off 可以关掉这种方法 ..

下面又用了一个 include ,包含进来了一种类型的文件,位置是 /etc/nginx/conf.d .. 在这个目录下所有的后缀是 .conf 的文件都会被包含进来 ...

也就是在这个 conf.d 目录的下面,我们可以去创建一些 .conf 文件,在上面添加需要的配置,这些配置都会被 NGINX 用到。

keepalive_timeout,设置的是跟客户端保持连接的超时的时间,就是一个跟客户端保持的连接,如果客户端没有反应,这个连接要保持多久以后再断开。

http://nginx.org/en/docs/http/ngx_http_log_module.html#log_format
http://nginx.org/en/docs/http/ngx_http_log_module.html#access_log
http://nginx.org/en/docs/http/ngx_http_core_module.html#sendfile
http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout

https://www.safaribooksonline.com/library/view/nginx-high-performance/97...
https://www.safaribooksonline.com/library/view/nginx-high-performance/97...

nginx.conf 文件

image.png

来自 https://ninghao.net/video/4001#info

4)server


在 nginx 的主配置文件的 http 这个区域里,包含了 conf.d 目录下的所有的 .conf 文件,打开这个目录 .. 下面有一个 default.conf ..

这个配置文件里用了一个 server 区域,每个 server 区域定义的就是一个虚拟服务器 .. 或者叫虚拟主机 ..

之前我们安装好 nginx 以后,在浏览器输入服务器的 ip 地址,打开的界面就是这个虚拟的服务器提供的 ..

在 server 区域里,可以设置服务器相关的信息。比如监听的端口号 .. 用的是 listen 这个指令,这里设置的是 80,它是 http 协议默认使用的端口号 ..

server_name 设置的是给这个服务器绑定的那个主机名 ... 它的值决定了客户的请求要使用哪个 server 区域来接待 ...

在 server 区域下,可以使用 location 划分一下区域 ... 它们决定了访问这个服务器的不同的部分需要怎么样去处理 ... location 设置的是一些匹配的模式 .. 比如这个 /,表示如果请求的地址里包含这个 / ,就使用这个 location 里的配置 .. location 的匹配模式里面还可以使用正规表达式 ..

在这个 location 里面用了 root 指令,设置了一个主目录,也就是如果请求匹配这个 location 设置的模式,它的可用的资源会在 /usr/share/nginx/html 这个目录下面 ...

现在这个目录下面存储的就是你看到的那个 nginx 的欢迎界面 .. 这个 index 设置的是默认打开的页面 ... 这里有两个值,一个是 index.html ,一个是 index.htm ,如果访问的时候不指定具体的请求的资源,默认先会打开 index.html 这个文档 ... 如果没有的话,会继续尝试打开 index.htm 这个文档 ...

image.png

来自  https://ninghao.net/video/4002#info

虚拟主机

5)创建虚拟主机:添加主机记录

我们可以自己去创建一个虚拟主机,或者叫虚拟服务器 .. 一般我们会先去配置一下域名,添加一条新的 DNS 记录 ... 设置一下让某个主机名指定服务器的 IP 地址 ..

下面我们可以在本地去模拟一下这个过程 ...

编辑一下自己电脑上的 hosts 文件 .. macOS ,这个文件是在 /etc/hosts ... Windows 系统,这个 hosts 文件会在其它的位置上 ... 具体你可以搜索一下系统里的这个文件 ...

打开以后,可以在这里添加几条新的记录 .. 先是服务器的 IP 地址 .. 我用的是一台虚拟机,给它设置的 IP 地址是 192.168.33.11 .. 空格的右边是指向这个 IP 地址的主机名 .. 可以随便编一个名字 .. 比如 hello.dev ... 这样我们在浏览器上访问 hello.dev 的时候,指向的就是 IP 地址是 192.168.33.11 的这台服务器 ..

这个过程跟我们为域名添加 DNS 记录是差不多的意思 ... 我们可以再添加几条记录 .. IP 依然是 192.168.33.11 .. 对应的主机名是 www.hello.dev .. 再添加一条 .. 让 192.168.33.11 对应 api.hello.dev ..

再让 php.hello.dev 也指向服务器的 IP 地址 ...

保存一下这个文本文件 ...

打开终端 ... ping 一下刚才设置的主机名 .. hello.dev ... 你会发现,这个主机名指向的 IP 地址是 192.168.33.11 ... 也就是你在本地对 hello.dev 的请求,会被指向 192.168.33.11 这个 ip 地址 ...

来自 https://ninghao.net/video/4004#info

6)创建虚拟主机:配置文件


在这个 conf.d 目录的下面,我们可以给想要创建的虚拟主机添加一个配置文件 .. 名字可以是 hello.conf .. 先添加一个 server 区域 ... 一个 server 区域就是一个虚拟主机 ...

里面先用一个 listen .. 设置一下这个服务器的监听的端口号 ... 先把它的值设置成 80 ... 结尾的地方要使用一个分号 ... 另起一行,再添加一个 server_name 指令 .. 设置一下服务器的名字 ... 也就是用户在访问哪个主机的时候,要使用这个服务器来接待他们 ... 先把它设置成 hello.dev ... 之前我们已经设置了,让这个主机名指向服务器的 IP 地址 ...

然后再用一个 root,去设置一下这个服务器的根目录 ... 比如把它设置成 /mnt/app/hello ...

我们再登录到服务器 ... 去创建服务器需要的这个目录 ...

sudo mkdir -p /mnt/app/hello

之前我们创建的这个虚拟服务器,它的公开的资源,我们要把它们放到这个 hello 目录的下面 ... 这里我可以先去下载一个 html 的文档,把它放到这个目录的下面 ..

在我的 nest 仓库的下面,app ... index.html ... 再打开这个原始文档 ... 复制一下它的地址 ... 回到终端 ... 用 curl 把它下载到 /mnt/app/hello 这个目录的下面 ..

sudo curl -o /mnt/app/hello/index.html https://raw.githubusercontent.com/ninghao/nest/master/app/index.html

然后再测试一下 nginx 的配置 ... sudo nginx -t ... 提示测试成功以后 .. 重新加载一下 nginx ...

sudo systemctl reload nginx

打开浏览器,访问一下 hello.dev ... 你应该会看到一个 hello 页面 ... 如果出现的是一个 403 的页面,我们需要再去解决一个问题 ...

image.png

image.png

image.png

image.png

image.png

测试 nginx

image.png

重新加载 nginx (重启 nginx )

image.png

来自  https://ninghao.net/video/4005#info

7)解决 403 Forbidden 错误

如果你能看到一个 hello ,说明一切正常,如果显示的是一个 403 的错误页面,很可能是因为 SElinux 的原因 ... 回到终端 ...

先执行一下 getenforce ... 它可以查看 SElinux 的状态 ... 如果返回的是 Disabled ... 说明没有运行 ... 那个 403 的错误应该就是其它的权限问题引起的 .. 我这里显示的是 Enforcing ,说明 SElinux 正在运行 ...

这样的话,我们可以修改一下网站主目录还有它里面的文件的安全上下文 ... 用的命令是 chcon .. 意思就是 change file security context ... 加上一个大写的 R 参数,表示递归 .. 再用一个 t 参数,设置一下类型 ... 类型是
httpd_sys_content_t ... 要修改的目录是 /mnt/app .. 执行一下 ..

chcon -Rt httpd_sys_content_t /mnt/app

再回到浏览器 ... 刷新一下 .. 现在就可以正常的显示这个 hello 页面了 ...

查看 SElinux 的状态

image.png

权限问题引起的 403 错误 ,chcon  意思就是 change file security context

image.png

来自  https://ninghao.net/video/4006#info

8)默认的服务器

用户直接访问服务器的 IP 地址,显示的就是一个默认的 NGINX 的欢迎页面 ... 这个是在 default.conf 里面定义的 ... 再访问一下 www.hello.dev ,这个主机名指向的也是我们的服务器 .. 但是我们没有特别的给这个主机配置一个服务器 .. 所以显示的还是这个默认的欢迎页面 ..

我们可以自己去定义这个默认的服务器 .. 在 conf.d 的下面新建一个配置文件... 名字可以是 custom_default.conf ... 在这个配置文件里添加一个 server 区块 ...

里面用一个 listen 设置一下监听的端口号 ... 比如 80 ... 在它的后面再加上一个 default_server ... 表示这是一个默认的服务器 ...

不特别指定 server_name ... 然后用一个 root 设置一下它的根目录 ... /mnt/app/hello ... 这样如果用户在访问服务器的 80 端口的时候,如果 NGINX 没有找到绑定了合适的主机名的 Web 服务器,就会使用在这里定义的这个 Web 服务器 ...

重新加载一下 NGINX ... 刷新一下 .. 会显示 hello 这个页面 .. 因为 www.hello.dev 这个主机名,我们并没有给它配置一个服务器 ... 所以就会使用刚才定义的那个默认的服务器来接待 ...

再直接访问一下服务器的 IP 地址 ... 也会显示这个 hello 页面 ..

现在任何指向了我们服务器 IP 地址的主机名, 访问它们的时候,服务器都会给它们返回这个 hello 页面 .. 如果你不想接待这些访问 ... 可以这样 ... 在这里 return 一个 444 ... 444 不是标准的 http 代码,所以它会让 nginx 立即断开连接 ...

重新加载 NGINX ...

回到浏览器,刷新一下 .. 这里我用的是服务器的 IP 地址 ... 访问它的时候,会显示无法正常运作 ... 因为现在我们的 NGINX 服务器不接待这样的访问 ..

再试一下 www.hello.dev ... 同样会显示这个页面 ...

定义默认的虚拟服务器

image.png

image.png

重新加载  nginx (重启nginx)

image.png

让禁止访问 444不是标准的 http 代码 所以禁止访问了 

image.png

重新加载 nginx (重启 nginx )

image.png

来自  https://ninghao.net/video/4007#toc

处理请求

9) NGINX 如何处理请求:server_name

访问 hello.dev 的时候会显示这个 hello 页面,这是我们在 hello.conf 里定义的 ... 因为在这个配置文件里定义的 Web 服务器,用了一个 server_name 指令,它的值就是 hello.dev .. 所以如果客户的请求的头部信息里面,它的 HOST 的值如果是 hello.dev ... NGINX 就会用这个 Web 服务器来处理这个请求 ...

回到浏览器 .. 开发者工具(alt + command + i) .. 打开 Network 这个选项卡 ... 刷新一下 ... 选中这个 hello.dev ..

看一下这个请求的 Request Headers ,请求的头部信息 ... 在这里,你会看到这个请求的 HOST 的值是 hello.dev ... NGINX 收到了这个请求,检查自己的配置文件,发现在 hello.conf 里面定义的服务器,它的 server_name 的值是这个 hello.dev ,所以就会使用这个服务器来接待这个请求 ..

在这个 server_name 里面,我们可以继续添加其它的主机名 ... 比如这里再把 www.hello.dev 添加到这里 ... 主机名之间可以使用空间分隔开 ..

重新再加载一下 NGINX ... 访问一下 www.hello.dev ... 显示的是跟访问 hello.dev 的时候一样的页面 ... 因为接待这两个主机名的访问是同一个 Web 服务器 .. 就是在 hello.conf 里面定义的那个 ..

image.png

重新加载 nginx (重启 nginx )

image.png

来自  https://ninghao.net/video/4009#info



10)NGINX 如何处理请求:listen


NGINX 收到一个请求以后,会先看一下请求的是哪个 ip 还有端口号 .. NGINX 还会检查请求里的 HOST 是什么 .. 然后它会决定到底使用哪个服务器去处理请求 ...

在浏览器上打开 hello.dev ... 打开开发者工具里的 Network 选项卡 .. 刷新一下 .. 选中这个 hello.dev .. 查看一下请求的 Headers ...

你会看到这里的 Remote Address,是 192.168.33.11:80 ... 冒号前面的东西是服务器的 IP 地址,因为 hello.dev 这个主机名指向的就是这个 IP 地址的服务器 ... 冒号后面的东西是端口号 ... 80 是 http 的默认的端口号 ..

这个请求的 HOST 是 hello.dev ... 所以这个请求会用 hello.conf 里面定义的服务器来接待 .. 它的 listen 指令的值是 80 ... 这里你也可以特别指定一下服务器的 IP 地址 .. 像这样 .. 192.168.33.11:80 ...

请求符合这个要求,然后会看一下请求里的 HOST 跟 NGINX 的 server_name 是不是匹配 ...

我们可以改一下这个端口号 .. 比如换成 8080 ... 重新加载一下 nginx ... 回到浏览器 .... 刷新 ... 页面不能正常显示 ...

这样现在访问的远程主机的地址是 192.168.33.11:80 ... 在这个主机名的后面,我们再加上一个 :8080 ... 这次又可以正常显示 hello 这个页面了 ..

这是因为,现在 hello.conf 里面定义的这个 web 服务器监听的端口号是 8080 ...

我们再把它恢复成原来的 80 ...

image.png

image.png

image.png

重新加载 nginx (重启 nginx )

image.png

image.png

来自  https://ninghao.net/video/4010#info

11)location

在 server 区块里面,可以添加一些 location 区块 .. 在这些 Location 区块里面,你可以更具体的设置让 NGINX 怎么样处理不同的访问 ...

定义一个 location 区块,可以用一个 location ... 然后是一个匹配的东西,先添加一个 / , 对这个服务器的任何的请求都会匹配这种模式 .. 后面是一组花括号 ...

在里面,可以去使用一些指令来设置一下 ... 比如用一个 index 指令,设置一下默认打开的文档 ... 先添加一个 index.html ...

NGINX 会使用最具体的那个 location , 再添加一个 location ... 匹配的是 /v2 ... 在它里面,我们可以重新设置一下 root ... 设置成 /mnt/app

这样访问 hello.dev/v2 开头的地址的时候,会使用这个 location 里设置的东西 .. 它的可用的资源的位置应该是在 /mnt/app 后面还要加上这个 /v2 ...

回到终端 ... 复制一下 /mnt/app/hello 这个目录,放到 /mnt/app/v2 这里 ... 编辑一下 /mnt/app/v2 下面的 index.html .. 修改一下这个文档里的内容 ... hello_v2 ... 保存一下 ...

然后重新加载一下 nginx ... 回到浏览器 ...

访问一下 hello.dev ... 打开的是 /mnt/app/hello 目录下的 index.html 这个文档 ... 再访问一下 hello.dev/v2 ... 现在这里显示的是 /mnt/app/v2 这个目录下的 index.html ...

image.png

image.png

image.png

重新加载 nginx (重启 nginx )

image.png

image.png

image.png

来自  https://ninghao.net/video/4011#info


12)带正则表达式的 location


在 location 上面,可以使用正则表达式来设置匹配的模式 ... 比如我想单独设置一下处理对图像资源的请求 .. 添加一个 location .. 在它的匹配这里用一个正则表示式,\.(gif|jpg|png)$ .. 它匹配的的地址就是用 .gif 或者 .jpg ,或者 .png 结尾的 ...

在它的前面,我们可以再用一个 modifier .. 用一个 ~* ... 它的意思匹配的表达式不区分大小写 ... 在这个 location 区块里面,用一个 expires 指令 ... 它可以设置资源过期的时间 ... 设置成 30d ... 表示 30 天 ..

也就是现在如果有人请求得到这个服务器上的图像资源,这些资源被标记的过期时间是 30 天以后 .. 也就是用户在强制刷新浏览器以后,这些图像资源不会被重新的下载 .. 直到 30 天以后 ...

我们可以在服务器上添加一张图片 ... 复制一下这个图像的地址 ... 新建一个目录 ... 位置是 /mnt/app/hello/img

mkdir -p /mnt/app/hello/img

再使用 curl 把图像文件下载到 /mnt/app/hello/img 的下面,名字是 logo.png ... 复制的地址粘贴过来 .. 再执行一下 ...

然后重新加载一下 nginx ...

完成以后,打开浏览器 .. 访问一下 hello.dev/img/logo.png ... 打开开发者工具的 Network 选项卡 .. 刷新 .. 选中这个 logo.png .. 看一下它的 Response Headers .. 这里会要出现一个 Expires .. 它的值就是这个图像过期的时间 .. 下面的 date 是下载这个图像的时间,它跟 Expires 之间正好是一个月 ...

说明客户在请求这个图像资源的时候,用的是刚才我们添加的这个 location 处理的 ..

NGINX 决定了用哪个服务器处理请求以后,会看一下服务器里的 location 区块 .. 它会使用匹配的最具体的那个 location .. 然后再继续查看使用了正则表达式的 location ,看一下是不是匹配 ... 如果匹配就用这个 location (如果匹配这个正则 location ),NGINX 会停止继续检查其它的 location ...

image.png


image.png


重新加载 nginx (重启 nginx )

image.png

image.png

来自 https://ninghao.net/video/4012#info


反向代理

13)反向代理 - Reverse Proxy

NGINX 作为反向代理用 .. Reverse Proxy , 功能就是,NGINX 接收到客户的请求以后,会断开连接,然后把收到的请求发送给别的服务器去处理。

在这个 hello.conf 里面定义的服务器这里 .. 可以用一下反向代理的功能 .. 添加一个新的 location ... 匹配 /api ... 在这个区块里,再用一下 proxy_pass .. 它的值应该就是 upstream 服务器的地址,也就是上游服务器的地址 .. 把它设置成 http://api.hello.dev ..

意思就是,有人请求 /api 前缀的资源,就把这个请求交给 api.hello.dev 这个服务器去处理 .. 这个服务器的类型可以有很多种 ..

比如它也可以是一个 NGINX 的服务器 .. 在 conf.d 下面添加一个新的配置文件 .. 名字是 api_hello.conf .. 用一个 server 区块去定义一个服务器 ... listen 80 端口 .. server_name 是 api.hello.dev ..

根目录是 /mnt/app ... 给这个服务器单独设置一个访问日志 .. 用的是 access_log 指令 ... 日志文件的位置是 /var/log/nginx/api_access.log .. 级别是 main ..

回到终端,我们再去创建一个目录 .. 位置是 /mnt/app/api .. 在这个目录的下面新建一个文件 ... 名字是 index.json .. 添加点内容 ... 然后保存一下 ...

再重新加载一下 nginx ...

打开浏览器 .. 访问一下 hello.dev/api/index.json ... 这个请求里包含 /api 前缀 .. 在 hello.conf 里定义的服务器会中断这个连接,然后由这个服务器发出一个新的连接到上游的服务器 .. 位置就是 api.hello.dev ...

这里显示的内容就是 api_hello 这个服务器提供的资源 ..

image.png

image.png

image.png

目录 应该是 /mnt/app/api 下面 记住要包含api

image.png

image.png

重新加载 nginx (重启 nginx )

image.png

image.png

来自  https://ninghao.net/video/4014#info

14)真实的 IP


先查看一下 api hello 这个服务器的访问日志 ... tail /var/log/nginx/api_access.log .. 你会发现,这条日志的最前面,现在显示的并不是客户的真正的 IP 地址 ..

这个这个连接是由反向代理服务器发出的 .. 也就是,最前面的这块 IP 地址应该是那台反向代理服务器的 IP 地址 .. 因为我们把它们放在了同一台服务器里,所以这个 IP 地址是 127.0.0.1 ,表示本机的环路地址 ..

想在日志里得到用户的真实的 IP ,可以再去设置一下 ... 在这个 hello.conf 里面设置了反向代理的地方 .. 添加一个 proxy_set_header ... 用它设置一下请求的头部信息 .. 设置的头部信息是 X-Real-IP .. 它的值,可以使用 $remote_addr 这个变量来表示 .. 它的值应该就是客户的真实的 IP 地址 ..

再用一下这个指令 .. 添加一个 X-Forwarded-For 这个头部信息 .. 它表示这个转发是为谁做的 .. 它的值设置成 $proxy_add_x_forwarded_for ..

保存 ... 重新加载一下 NGINX ... 回到浏览器 .. 现访问一下这个 hello.dev/api/index.json ... 然后再去查看一下访问的日志 ...

在第二条日志的最后 .. 会出现最初发出请求的那个客户的真实的 IP 地址 ...

这个日志的记录的形式是在 nginx.conf 里面配置的 ... 用的指令是 log_format .. 最后会有一个 $http_x_forwarded_for ... 它的值就是我们在反向代理那里,使用 proxy_set_header 这个指令添加的 X-Forwarded-For 这个头部信息里的内容 ...


查看访问日志

image.png

image.png

重新加载 nginx (重启 nginx )

image.png

image.png

image.png



来自  https://ninghao.net/video/4015#info


FastCGI

15)用 FastCGI 处理 PHP 的请求:安装

NGINX 只能处理对静态资源的请求,比如 html,css,图像,视频等等。用户如果请求的是 php,nginx 不懂 php ,这就需要使用 fastcgi ,也就是把请求交给 fastcgi 去解释一下,处理好以后,再交给 nginx, 最终 nginx 会把处理以后的结果统一交给客户 ...

安装IUS仓库,这样才能用 yum 去安装比较新的软件包

我们需要用到 php-fpm,你可以把它想成是 php 版本的 fastcgi ... 先添加一个 ius 仓库,它里面有比较新的 php ..

yum install https://centos7.iuscommunity.org/ius-release.rpm -y

然后搜索一下 fpm ... yum search fpm .. 找到一个 php70u-fpm ,这个包就是刚才安装的 ius 仓库里提供的 .. 它是 php7.0 这个版本的 fpm ... 安装一下它 ..

yum install php70u-fpm -y

完成以后再启动一下 php-fpm ... systemctl start php-fpm ... 可以再让它开机自启动 .. systemctl enable php-fpm ..

添加一个 ius 仓库

image.png

搜索 fpm

image.png

安装一下 php70u 版本的 fpm

image.png

启动  php-fpm

image.png

开机自启动

image.png


来自  https://ninghao.net/video/4017#info

16)用 FastCGI 处理 PHP 的请求:配置

新建一个配置文件 .. 名字可以是 php_hello.conf .. 用一个 server 区块定义一个服务器 .. listen 的是 80 端口 .. 绑定的 server_name 是 php.hello.dev .. 我已经让这个主机名指向了我的服务器的 IP 地址 ..

它的 root 是 /mnt/app/php ... 再添加一个 location .. 匹配的是地址里面是 php 结尾的请求 .. 用一个 ~ 修饰符 ..表示匹配的时候区分大小写 ..

在这个 location 区块里面,先用一个 fastcgi_pass .. 这个指令的值就是 fastcgi 服务的位置 ... 设置成 127.0.0.1:9000 ... 9000 是 php-fpm 默认使用的端口号 ..

另起一行 .. 再用一个 fastcgi_index ... 设置一下默认的索引文件 ... 一般就是 index.php ... 然后要添加一个 fastcgi_param .. 添加一条参数 .. 参数的名字是 SCRIPT_FILESNAME ... 请求的脚本文件的位置 ... 它的值先用一个 $document_root .. 这个参数表示的是 root 指令的值 ... 后面接着再用一个 $fastcgi_script_name... 它表示请求的那个脚本文件的名字 ...

然后再用一个 include 指令,包含进来一个 fastcgi_params 文件 ... 它的位置是在 nginx 配置的根目录的下面 .. 里面设置了一些 fastcgi 的参数 ..

回到终端.. 新建一个目录 .. 位置是在 /mnt/app/hello/php .. 在这个目录的下面新建一个 php 文件 ... 名字是 index.php ... 添加一组 php 的标记 .. 再用一个 echo ... 输出 hello ~ ...

重新加载 nginx ...

回到浏览器 .. 访问一下 php.hello.dev ... 这里出现了一个 403 错误 .. 在这个地址后面添加一个具体的脚本文件的名字 ... index.php ...

这里显示的就是使用了 php 的 echo 输出的一个 hello .. 说明我们的服务器已经可以处理对 php 脚本的请求了 ... 再回到这个配置文件 ...

这里我们可以再定义一个 location 区块 .. 匹配的是 / ... 里面用一下 index 设置一下默认打开的文件 .. 添加一个 index.php 再添加一个 index.html ..

重新加载一下 nginx ...

回到浏览器 .. 直接打开 php.hello.dev ... 没有指定具体的脚本文件 ... 默认会打开 index.php ... nginx 收到这个请求以后,先匹配了这个 location / ... 这里用了 index 指令设置了默认打开的文件 .. 然后继续去匹配带正则表示式的 location ... index.php 用的是 .php 结尾的,所以会匹配下面的这个 location ...

nginx 会把请求交给 php-fpm 去处理 .. 得到了结果以后,再把结果再交给发出请求的客户 ...

image.png

image.png

image.png

创建目录 远程编辑

image.png

image.png

重新加载 nginx (重启 nginx )

image.png

image.png

image.png

重新加载 nginx (重启 nginx )

image.png

image.png

来自 https://ninghao.net/video/4018#info

17)try_files 的地址重写(伪静态)

很多 php 应用都可能需要重写地址,也就是去让那些带参数的地址看起来更友好一点 .. 要让 nginx 可以支持这个功能 .. 我们可以再配置一下这个服务器的 location / 这个区块 ...

添加一个 try_files 指令 ... 它可以按顺序检查请求的资源 .. 添加一个 $uri .. 这个参数表示的是请求的地址 .. 如果请求的文件存在,就返回这个文件 ... 再添加一个 $uri/ .. 意思就是,如果请求的是一个目录,它如果存在的话,就去返回这个目录下的东西 ..

后面再添加一个参数 .. /index.php?$query_string ... 这个 $query_string 就是 php 应用地址里的查询符 ..

现在这个服务器的配置就支持一般的 php 应用的地址重写功能了。

location / {
try_files $uri $uri/ /index.php?$query_string;
}

image.png

来自  https://ninghao.net/video/4019#info

普通分类: