2019独角兽企业重金招聘Python工程师标准>>>

nginx整合php

前段时间,在内网搭建了一个基于LNMP的个人cms站点,第一次接触了nginx,最开始了解nginx只知道nginx是个web服务器,仅此而已。后来,又有一次是在内网搭建私有云(KodExplorer),环境是nginx+php+KodExplorer。这一次搭建我就想了解下nginx。于是便有了这篇文章。

接下来的内容都是基于nginx+php+KodExplorer 而展开的。

1、什么是nginx

2、如何安装nginx

3、nginx是如何响应web请求

4、什么是fastcgi

5、nginx的匹配规则和顺序

5、扩展

一、什么是nginx

nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。nginx是由俄罗斯人lgor  Sysoev开发。Nginx因它的稳定性、丰富的功能集、示例配置文件和低系统资源消耗而闻名。国内像腾讯、新浪、网易等都开始部署使用Nginx。(以上摘自Nginx的官网   http://wiki.nginx.org/NginxChs)

二、如何安装nginx

本次安装采用的是自动化脚本安装,具体的可以参照我的另一个博客,nginx自动化安装脚本。

三、nginx是如何响应web请求       

如果让我用文字,可能我半天也说不明白,还是从nginx.conf的配置文件上 来说明nginx是如何响应客户端的请求的。

#定义nginx运行的用户和用户组,这也就解释为啥/data/www/html的用户和用户组都是www.www
user www;
#nginx的work进程数,一般是根据服务器的cpu总核心数而设定的。
worker_processes 2;#error_log /dev/null;
#定义全局错误日志,
error_log /data/log/nginx_error.log info;#进程文件的pid
pid logs/nginx.pid;
#一个nginx进程打开的最多文件描述符数目。
worker_rlimit_nofile 8192;#设置nginx的工作模式与连接数上限
events {#epoll是Linux内核一种高性能I/O模型,可以最大化的支持nginx。use epoll;#单个进程最大连接数。worker_connections 8192;
}#nginx可以被定位一个HTTP服务器,接下来设定就是如何响应客户端对服务器的HTTP请求。
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 /dev/null main;#默认编码格式为utf-8charset utf-8;#上传文件大小的限制   client_header_buffer_size 32k;#设定请求缓存的大小large_client_header_buffers 4 32k;#服务器名字的hash表大小server_names_hash_bucket_size 512;#开启高效文件传输模式。sendfile on;#防止网络阻塞tcp_nopush on;#长连接超时时间60秒keepalive_timeout 60;#防止网络阻塞tcp_nodelay on;#设定请求缓存大小client_max_body_size 10m;#client_body_buffer_size 128k;#proxy_connect_timeout 600;proxy_read_timeout 600;proxy_send_timeout 600;proxy_buffer_size 8k;proxy_buffers 4 32k;proxy_busy_buffers_size 64k;proxy_temp_file_write_size 64k;proxy_temp_path /dev/shm/proxy_temp;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE_ADDR $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#一个server块,可以看成是一个虚拟的主机。server {#监听80端口listen  80;#服务器的名称为10.68.4.201,这里也可以写域名,不过域名要在hosts文件中注释说明。server_name 10.68.4.201;#设定该虚拟主机的默认网站根目录位置root  /data/www/html/kodexplorer3.12 ;#设定首页索引文件的名称index index.html index.htm index.php;autoindex on;#匹配.php的请求就交给FastCGI处理。             location ~ [^/]\.php(/|$) {#fastcgi采用TCP的连接方式。fastcgi_pass 127.0.0.1:9000;#fastcgi 默认首页文件fastcgi_index index.php;#这里就是nginx把参数传递给fastcgi的的默认根站点目录。#fastcgi_param SCRIPT_FILENAME $SCRIPT$fastcgi_script_name;(默认项)fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}#查看nginx的状态。location /nginx_status {stub_status     on;access_log      off;}#静态页面和文件由nginx自己处理,默认保存30天。location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {expires         30d;}#.js和.css文件交给nginx处理,保存12个小时。location ~ .*\.(js|css)?$ {expires         12h;}}
}

以上是我机器的nginx配置文件,配置文件中server { } 可以看成是一个虚拟的主机,这个虚拟主机就会对用户访问的url进行解析,匹配。然后将匹配后的到的文件,返回给请求端。配置文件中可以写多个server { }  来应对不同的访问

 四、什么是fastcgi   

CGI也叫“公共网关接口”,是一种协议。HTTP服务器与其他服务器上的程序进行“交谈”的一种工具。当客户端向nginx请求一个.html的静态文件时,nginx会去root指向的目录查找该文件并发送给客户端,众所周知,目前的网络上的页面,大都是动态的页面,而动态的页面往往嵌套函数,而这些函数nginx是无法解释的,就拿.php页面来说,当客户端向nginx服务器请求一个.php页面,nginx知道自己无法处理这个.php页面,于是乎他便把这个请求转给能够解释这个页面的程序也就是PHP软件,那么nginx向PHP程序传递这个请求的时候,就用到了CGI协议,CGI协议规定了,双发要互传哪些参数的当web服务器收到一个.php请求后,会启动一个cgi程序,也就是PHP的解析器--php.ini。当PHP解析完成后,同样通过cgi把解析后内容返回到nginx,由nginx整合后再向客户端发送请求后的数据。当请求完成后,PHP进程也就退出。那么当下一个请求过来后,同样又要启动PHP进程,cgi传输数据,结束进程。非常的浪费时间。而fastcgi   php-fpm会是启动一个master主进程,然后在启用多个worker子进程。当有请求过来时,fastcgi会去调用worker进程完成数据的传送。fastcgi高效在这里。以后的PHP中把fastcgi纳入到程序中了。

本文参照网友@尹川解释说明。原文  http://segmentfault.com/q/1010000000256516,   在此表示感谢。

Nginx 连接FastCGI有两种方式:TCP和unix  domain  socket

TCP的连接方式是     fastcgi_pass    127.0.0.1:9000 ;

SOCKET的连接方式是    fastcgi_pass    unix:/dev/shm/php-cgi.sock ;

记得当时在调整测试nginx时,当时fastcgi_param的默认项如下。

    fastcgi_param SCRIPT_FILENAME $SCRIPT$fastcgi_script_name;

结果当我访问http://10.68.4.201/index.php  浏览器报file  not   found的 错误。有时还报404的错误。因为$SCRIPT这个参数指的是/script目录,而该目录下并没有index.php文件,当然就报错,所以 这里你可以写填写你工程的绝对路径 像  fastcgi_param   SCRIPT_FILENAME  /data/www/html/KodExplorer3.12$fastcgi_script_name; 这样nginx就可以找到文件并传递给PHP解析。
         当然了,我的location没有配那么多(按照实际需要来。) 这时,当我在访问http://10.68.4.201/index.php 就可以打开网页了。

五、nginx的匹配规则与顺序。

当我们通过url 向nginx服务器发送访问请求时,nginx---server---location,nginx会根据location对客户端访问的url进行匹配。一般情况下一个server模块下可以有多个location,多个location就对应着多种匹配规则。多个location就有多种访问的url。

下面我来说下location的匹配规则。这里要感谢这位博主 http://www.cnblogs.com/lidabo/p/4169396.html,一开始,我也对nginx的location的匹配规则很不了解,配来配去,经常出现403,404的错误。然后又搞不清,到底如何匹配。看了这位博主后,加上自己的实验,开始对nginx的location配置匹配规则有了些许的认识。

server { } 块下的location大致可以分为两类(@这一种暂不考虑)一种是普通 location [=|^~|/xxx/a.html|/]  {  }  ,另一种是正则 location [~|~*] {  } 。nginx官方给出的匹配顺序是,nginx优先匹配普通location ,再去匹配正则location 。当普通和正则均有匹配项时,nginx采用正则location匹配的结果。

        server {listen 8080;server_name www.cnin.com ;root    /data/www/html;location / {index index1.html;}location ~ /nginx {index index3.html;}location  /nginx {index index4.html;}}
[root@localhost conf]# curl http://www.cnin.com:8080/nginx/
this is index3.html
[root@localhost conf]# curl http://www.cnin.com:8080/
this is index1.html

但是如果普通location 是一下三者情况,nginx匹配普通location后,将不再匹配正则location

                location = / {                        ----严格匹配index index2.html;}location ~ /nginx {                   index index3.html;}location ^~ /nginx {                  ----不继续匹配正则index index5.html;}location  /nginx/index6.html {        ----精确匹配index index6.html;}
[root@localhost conf]# curl http://www.cnin.com:8080/
this is index2.html
[root@localhost conf]# curl http://www.cnin.com:8080/nginx/
this is index5.html
[root@localhost conf]# curl http://www.cnin.com:8080/nginx/index6.html
this is index6.html

当nginx根据location去匹配URL时,譬如http://www.cnin.com:8080/nginx‍/index6.html。由于server块中写了root   /data/www/html   server_name  www.cnin.com:8080  所以 http://www.cnin.com:8080 刚好匹配上server块的定义,那么接下来的/nginx   nginx就会在/data/www/html目录下去寻找名叫 nginx的目录或者文件。 如果没有找到相关的 文件,尝试多次后无果后,nginx就会返回一个404错误。 如果有nginx目录,但是没有index文件,那么同样也会返回404错误。当然这里nginx找到只是本地的文件,如果nginx是做转发,则另谈。

nginx匹配普通location时,与nginx.conf 中location书写的顺序无关。而当去匹配正则location时,则与书写的顺序有关。

                location ~* /PNG/ {                              PNGindex index7.html;                        |---->index7.html}location ~* /png/ {                              png  index INDEX8.html;                        |---->INDEX8.html                            }                                                 |---->index9.html            location ~ /png/ {index index9.html;}
[root@localhost conf]# curl http://www.cnin.com:8080/PNG/
this is index7.html
[root@localhost conf]# curl http://www.cnin.com:8080/png/
<head><title>403 Forbidden</title></head>

就只改变了一处地方, http://www.cnin.com:8080/png/的答案却千差万别。

                location ~ /PNG/ {                              PNGindex index7.html;                        |---->index7.html}location ~* /png/ {                              png  index INDEX8.html;                        |---->INDEX8.html                            }                                                 |---->index9.html            location ~ /png/ {                                index index9.html;}
[root@localhost conf]# curl http://www.cnin.com:8080/PNG/
this is index7.html
[root@localhost conf]# curl http://www.cnin.com:8080/png/
this is INDEX8.html

通过这个例子,我们可以验证,当nginx匹配正则location时,是安装nginx.conf配置文件书写的顺序进行匹配的。下面我来解释下:当我们访问的是/PNG/时,nginx从上往下的搜索,搜索到第一个location ~* /PNG/ { } 时,刚好匹配,于是nginx就去/data/www/html/PNG/目录下去寻找index7.html 文件,而PNG目录下刚好有这个文件,于是把这个页面处理后的结果返回给了请求端,也就打印出了 “this  is  index7.html”。而当我们去访问 /png/时,如果按照之前所讲,nginx应该是找第二个location 即 location ~*  /png/ { } 那么,也就是打印 “this  is  INDEX8.html ”,可是nginx返回的却是 403 错误页面。经过我的测试发现,此时nginx匹配的却是第一个location  ~*  /PNG/ { }  ,也就是要去找index7.html,而/png/目录下面没有这个文件,nginx于是乎就报403错误(页面找不到),如果你在png目录下重新写一个“echo  this  is  /png/  index7.html > index7.html” 当你再访问http://..../png/时,此时nginx就会打印“this  is   /png/   index7.html  。验证了nginx匹配正则location 是按照书写的顺序来匹配的。为什么会这么匹配。因为我们再写 /PNG/的location时,声明了它是 ~*  不区分大小写的。那么url访问/png/自然可以匹配的上,于是就会去访问index7.html ,只不过是在/png/目录下面找index7.html,而不是在/PNG/目录下找。 而如果我声明的是location ~  /PNG/ { } 那么nginx在访问/png/时就不再去匹配 location ~ /PNG/ { } 。

以上是nginx做为HTTP服务器时,一些访问匹配规则。

------------------------------------------------------------------------------------------------------------

nginx还可以做代理服务器,那么该如何配置location

                location  /PNGKK/ {proxy_pass http://10.68.4.201/index.php;}        location ~ /staticd/ {                    ----这种写法错误,nginx无法启动proxy_pass http://10.68.4.201/index.php;}
nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression,
or inside named location, or inside "if" statement, or inside "limit_except" block in
/usr/local/nginx/conf/nginx.conf:147
大致意思是说proxy_pass不能再含有URI的location中使用正则规则。

根据nginx的匹配规则,我们知道,当用户访问 http://www.cnin.com:8080/PNGKK/  时,nginx会去/data/www/html/下去寻找PNGKK的文件或目录。而当nginx用来做转发时,这个规则就不起作用了。经过我的测试,我发现,转发的location  xxx {  }   中间可以写任意字符。

转载于:https://my.oschina.net/u/2322690/blog/465939

nginx+php+kodexplorer--内网私云服务器搭建相关推荐

  1. 怎么让内网显示云服务器ip,腾讯云内网IP怎么用

    内网服务即局域网(LAN)服务,云服务之间经由内部链路互相访问.腾讯云上的云产品可以经由 Internet 访问,也可经由腾讯云内网互相访问.腾讯云机房均由底层万兆/千兆互联,提供带宽高.时延低的内网 ...

  2. filebrowser + frp搭建一个公网+局域网访问的网盘(Windows内网+阿里云服务器)

    安装filebrower,caddy官网点击download  解压,新建Caddyfile,新建Caddyfile文件,无后缀,记事本打开,添加配置: :3000 root E:\caddy\ gz ...

  3. 内网穿透-----ngrok服务器搭建

    一,需求与ngrok简介 1)需求 有时我们需要进行内网穿透,也就是说我们需要去访问和使用一些内网的机器:比方说,我在实验室有一台机器,而实验室的网络是内网(192.168.0.48),这个时候我想在 ...

  4. 阿里云服务器搭建frp -实现内网穿透

    阿里云服务器搭建frp -实现内网穿透 什么是frp 准备工作 开始搭建 服务端 客户端 什么是frp frp 是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持 tcp, ...

  5. 云服务器搭建高可用keepalived+nginx+emqx集群

    云服务器搭建高可用keepalived+nginx+emqx集群 一.高可用emqx集群搭建 1 单机搭建emqx 2 配置认证和鉴权插件 3 搭建emqx集群 二.nginx搭建负载均衡 1 ngi ...

  6. Frps搭建内网穿透(服务器及客户端详细)

    目的:通过云服务器搭建内网穿透,实现外网访问内部应用或者服务(不限操作系统,服务器只需一个,客户端可以多个). 所需资源:阿里/百度/腾讯云服务器 有外网IP即可 软件下载(包含Windows.Liu ...

  7. 使用腾讯云服务器搭建个人网盘

    使用腾讯云服务器搭建个人网盘 应当说,个人网盘越来越普及,但是市面上的共有云网盘存在着不充会员就限速的特点.当然,这也不能怪各大厂商,毕竟中国商宽的价格就摆在那里,网盘运营者没有理由让免费用户也不限速 ...

  8. 云服务器配置网站卡顿,大型网游云服务器要多大配置才能解决卡顿等问题?

    用云服务器做游戏服务器自然是可以的,要是私人玩没有那么限制,一般1核2g的新睿云服务器就能够满足2-4个用户的需求.2个人玩的话一年也不卡,4个人勉强能玩,6个的话就会很卡.如果4个人以上联机玩,那么 ...

  9. 阿里云服务器搭建Nginx+rtmp推流服务器

    title: 阿里云服务器搭建Nginx+rtmp推流服务器 categories:[Centos] tags:[音视频编程] date: 2021/11/16 一.前期准备 服务器操作系统:Cent ...

最新文章

  1. 今年两会大火的新基建,平均企业月薪1.63万 | 2020新基建中高端人才市场就业吸引力报告...
  2. java命名$_java命名规范
  3. 基于aspectj实现AOP操作的两种方式——xml配置
  4. python 将ipv4的格式转换
  5. linux修改文件夹名称_1.3.2 对 Hello Word! 程序代码进行编辑修改
  6. 广外计算机考研专业课,【广外考研论坛】 21广外各专业考研问题全解答!纯干货!...
  7. java计算一个多边形的重心_2D凸多边形碰撞检测算法(二) - GJK(上)
  8. 融合时代 存储迎来无限可能
  9. 缓存与数据库的一致性
  10. 获取客户端ip_获取客户端访问真实IP
  11. 如何快速获知需要的SPS Sql Search语法
  12. vue3.0架手架搭建以及注意事项
  13. 种子文件转成为磁力链接 下载BT磁力转换小工具
  14. C++一个简单的弹窗程序
  15. Windows 10 如何修改桌面路径位置
  16. Xbox one VS. ps4
  17. useing eclipse formatting
  18. 第二节 控制系统的数学模型——传递函数
  19. 布局技巧(等高、圣杯)
  20. 【前端】JS的BOM和DOM,事件,表单验证案例

热门文章

  1. 1+X云计算平台运维与开发认证 资源
  2. 交叉编译的几个常用工具
  3. linux dig命令_如何在Linux上使用dig命令
  4. Java-jdk8下载安装教程、Jmeter下载安装教程2021(环境变量配置)
  5. 组织级过程资产库如何助力CMMI3-5级高效落地?
  6. “博士坐下,硕士留下,本科等下,专科让下!”你敢不努力学习?
  7. 求1~100以内的素数(判断一个数是否为素数)
  8. EfficientDet(EfficientNet+BiFPN)论文超详细解读(翻译+学习笔记+代码实现)
  9. javase和javaee的区别(javase和javaee和javame的区别)
  10. 睿赛德科技携手中国电子学会、意法半导体、广和通,共建嵌入式人才认证与培养体系...