文档章节

nginx+php+kodexplorer--内网私云服务器搭建

王九龙
 王九龙
发布于 2015/06/12 11:23
字数 3004
阅读 837
收藏 4

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-8
        charset 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/ {                              PNG
                        index 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/ {                              PNG
                        index 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 {  }   中间可以写任意字符。

















































© 著作权归作者所有

共有 人打赏支持
王九龙
粉丝 7
博文 17
码字总数 16418
作品 0
广州
私信 提问
阿里云VPC私网连接技术白皮书

概要 阿里云专有网络VPC(Virtual Private Cloud)是您基于阿里云构建的一个隔离的网络环境,专有网络之间逻辑上彻底隔离。您能够在自己定义的虚拟网络中使用阿里云资源,例如选择自己的IP地...

乐乎无趣
2017/11/01
0
0
企业上云,内网DNS请用PrivateZone

导读 DNS服务的作用就是就好比手机中的通讯录,可以通过域名找到对应IP。对于一家科技企业来说,搭建一套内网DNS是很有必要的。但是,当企业将网络整体搬迁到云上或者和云上网络相联通时,D...

云解析-pd
06/13
0
0
阿里云上搭建私网DNS的几种方案

前言: 私网DNS对一些客户来说是非常重要的,因为他们系统API之间一般都是通过私网域名调用的,如果私网DNS出现问题相当于手机失去基站,整个系统会瘫痪。我总结了三种搭建私网DNS的方案供大...

令荣1
07/13
0
0
智能接入网关试用报告 线下机构一站式上云

智能接入网关是阿里云最近发布的网络产品,可实现线下机构、站点一站式连接到VPC,快速构建混合云。本文以最简单的拓扑为例介绍如何使用智能接入网关,需要了解产品详情请戳传送门 。 测试拓...

光山居士
05/08
0
0
烂泥:openvpn双网卡客户端与内网机器通信

本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb。 前段时间写了一篇有关openvpn搭建与内网机器通信的文章,那篇文章是基于服务器单网卡进行...

烂泥行天下
2015/10/10
42
0

没有更多内容

加载失败,请刷新页面

加载更多

[LintCode] Linked List Cycle(带环链表)

描述 给定一个链表,判断它是否有环。 样例 给出 -21->10->4->5, tail connects to node index 1,返回 true。 这里解释下,题目的意思,在英文原题中,tail connects to node index 1 表示的...

honeymose
18分钟前
3
0
Android :报错Your project path contains non-ASCII characters.

报错内容如下 Your project path contains non-ASCII characters. This will most likely cause the build to fail on Windows. Please move your project to a different directory. See ht......

lanyu96
29分钟前
2
0
Nginx平滑添加模块

Nginx已经编译安装并运行了一段时间, 然后某一天, 发现需要用到某个模块但当初没有编译, 这个时候怎么办呢? 卸载重新安装肯定可以的, 如果Nginx版本没有变更的话, 则有一个相对平滑的方法来添...

老菜鸟0217
34分钟前
5
0
spark安装测试

spark安装测试 由于本地已经安装好hadoop相关组件,所以本文是在yarn的基础上对spark进行安装及测试 确保hdfs及yarn成功启动,hadoop版本为2.7.3 安装scala,由于本人安装的spark是2.4.0,对应...

-九天-
48分钟前
4
0
周末看完了《电能计量自动化技术》

整体质量还行,下面分别将心得记录如下: 第一章:发展历程可以看看,现在算是智能电网阶段 2:讲主站系统。以文件进行各模块的交互很值得思考,尤其是批量数据,多团队合作的情况下。另外线...

max佩恩
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部