nginx复习003--虚拟主机和nginx+php安装与配置以及一些nat模式经验

—–虚拟主机

–给网卡再绑定一个ip
方法1:

/sbin/ifconfig eth0:1 192.168.152.135 broadcast 192.168.152.255 netmask 255.255.255.0 up
/sbin/route add-host 192.168.152.135 dev eth0:1

方法2:
复制ifcfg-eht0文件一份 改成ifcfg-eth0:1
修改里面内容:

  DEVICE = eth0:1
    IPADDR = 192.168.152.135
    BOOTPROTO = none
    ONBOOT = yes

重启系统

–nginx虚拟主机配置
一个server节点就是一个虚拟主机

server {
    listen       80;  #监听的端口
    server_name  localhost; #服务绑定的地址 ip或域名
    # deny 192.168.152.131; #访问控制
    #charset koi8-r;

    location / {
        root   html; #服务访问的根目录
        index  index.html index.htm; #欢迎页,默认加载的页面,顺序从前到后
    }

    error_page   500 502 503 504  /50x.html; #错误页面
    location = /50x.html {
        root   html;
    }

}

–基于ip配置虚拟主机
–基于域名配置虚拟主机
–基于端口配置虚拟主机

—–nginx+php

–什么是CGI和FastCGI
实现php与nginx的整合,离不开FastCGI
对于nginx而言,php是一个外部程序,而非nginx内部的一个模块

由于linux平台下可以有多种不同的web服务器和应用程序
为了让web服务器的功能扩展性更强
就需要支持CGI(common gateway interface 公共网关接口)规范

–什么是CGI
CGI是web服务器与外部程序(cgi程序)之间的接口标准
用于两种不同程序之间的信息传递
举例:
web服务器(如apache nginx) -> 相当于一台电脑
CGI程序(如php) -> 相当于移动硬盘
CGI接口 -> 相当于usb接口,用于移动盘连接电脑

CGI规范允许Web服务器根据 浏览器请求 调用CGI程序,然后将 CGI程序的输出结果 通过响应发送给浏览器,从而使web服务器支持处理复杂的网站业务需求.

–CGI程序和nginx模块的区别
CGI程序:开发速度快,通用性好,但性能不高
nginx模块:c编写,开发速度慢,成本高,性能快,但不适合处理复杂多变需求

–CGI和FastCGI的区别
TS指Thread Safety,即线程安全,一般在IIS以ISAPI方式加载的时候选择这个版本。
NTS即None-Thread Safe,一般以fast cgi方式运行的时候选择这个版本,具有更好的性能。
具体:
从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用多进程的工作方式不同的是Windows系统是采用多线程的工作方式。如果在IIS下以CGI方式运行PHP会非常慢,这是由于CGI模式是建立在多进程的基础之上的,而非多线程。一般我们会把PHP配置成以ISAPI的方式来运行,ISAPI是多线程的方式,这样就快多了。但存在一个问题,很多常用的PHP扩展是以Linux/Unix的多进程思想来开发的,这些扩展在ISAPI的方式运行时就会出错搞垮IIS。因此在IIS下CGI模式才是 PHP运行的最安全方式,但CGI模式对于每个HTTP请求都需要重新加载和卸载整个PHP环境,其消耗是巨大的。
为了兼顾IIS下PHP的效率和安全,微软给出了FastCGI的解决方案。FastCGI可以让PHP的进程重复利用而不是每一个新的请求就重开一个进程。同时FastCGI也可以允许几个进程同时执行。这样既解决了CGI进程模式消耗太大的问题,又利用上了CGI进程模式不存在线程安全问题的优势。
因此:
如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(线程安全)的版本;
而用FastCGI模式运行PHP的话就没有必要用线程安全检查了,用None Thread Safe(NTS,非线程安全)的版本能够更好的提高效率

–安装linux版nginx https://blog.csdn.net/u010773667/article/details/51513958

yum -y install pcre pcre-devel openssl-devel zlib-devel

./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi

–记得创建/var/temp/nginx目录和/var/run/nginx目录

--window版php下载 https://windows.php.net/downloads/releases/archives/
--linux安装php

1> yum -y install libxml2-devel openssl-devel \
curl-devel libjpeg-devel libpng-devel freetype-devel
2> ./configure –prefix=/usr/local/php –enable-fpm \
–with-zlib –enable-zip –enable-mbstring –with-mcrypt –with-mysql \
–with-mysqli –with-pdo-mysql –with-gd –with-jpeg-dir –with-png-dir \
–with-freetype-dir –with-curl –with-openssl –with-mhash –enable-bcmath \
–enable-opcache


--类比 http://www.php.cn/php-weizijiaocheng-388947.html
-- 安装php常见错误 http://zl378837964.iteye.com/blog/2307174

--EPEL (Extra Packages for Enterprise Linux)是基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适用于RHELCentOSScientific Linux.
--yum install epel-release

--wget出现问题时候

wget: 第 1 行的 /etc/wgetrc 处发生语法错误。 Parsing system wgetrc file failed. Please check ‘/etc/wgetrc’, or specify a different file using –config.

--关闭wget的代理或者重新安装wget

-----php的FastCGI进程管理器-PHP-FPM
启动它,详情百度,分linux版和window版

--window版
--https://www.cnblogs.com/yiwd/p/3679308.htm

– .\php-cgi.exe -b 127.0.0.1:9000 -c C:/nginx/php-5.6.18-nts/php.ini


--linux1> 复制php-fpm.conf文件 /usr/local/php/etc/下
2> php-fpm添加到系统服务里面
    虽然执行sbin目录下的php-fpm可执行文件可以启动php-fpm,但这种方式比较麻烦
    所以采用php在源码包中提供了service方式管理php-fpmshell脚本
    把脚本文件复制到/etc/init.d目录中,通过chkconfig实现开机启动
    cp /usr/local/src/phpxxx/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm 
    chmod +x /etc/init.d/php-fpm
    chkconfig --add php-fpm

    通过service方式管理php-fpm
    service php-fpm start
    service php-fpm reload
    service php-fpm restart
    service php-fpm stop

    --php-fpm的进程启动后,监听9000端口
    主进程用户是root 子进程工作于nobody用户(可通过配置改为其他用户)

--php-fpm的配置文件php-fpm.conf
分全局配置和用户进程池配置

--php的配置文件 php.ini
默认情况下,php会去/usr/local/php/lib目录中搜索php.ini文件,但是该文件默认没有被安装
所以我们可以去php源码包找到两个预设的php.ini文件
php.ini-development(开发环境 开发项目是方便测试程序)
php.ini-production(上线环境 安全性较高)
任选一种预设配置复制到phplib目录中就行
cp php.ini-xxxx  /usr/local/php/lib/php.ini

--php.ini文件中有许多复杂的配置,主要是php的核心配置和各种扩展模块的配置

----nginx中配置环境FastCGI变量
--什么是FastCGI变量
举例:
浏览器与服务器之间通过http协议交互时,双方会传递各自的环境信息
nginxphp之间通过FastCGI交互式也需要传递一些信息,这些信息就是环境变量(FastCGI变量)

--在nginxconf目录中有一个fastcgi.conf文件
该文件中通过fastcgi_param数组型指令保存了一些环境变量
fastcgi_param指令的第一个参数是环境变量名称,第二个参数是对应的值
环境变量的名称和值得格式是有FastCGI接口规定的
主要包含客户端和web服务器的环境信息
--fastcgi.conffastcgi_params文件的区别
fastcgi_params中缺少了SCRIPT_FILENAME的定义.
由于历史原因,nginx保留了fastcgi_params这个文件.

-----nginx配置文件中支持php
配置思路:
1> 利用location匹配".php"请求
2> 将请求发给9000端口的php-fpm(fastcgi进程管理器)处理
3> 加载fastcgi.conf中的配置,发送FastCGI变量
4> 利用index支持index.php作为默认页

location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi.conf
}
“`

–php.ini date.timezone=prc或者UTC或者Asia/Shanghai
–判读php文件是否存在
分析两个问题:
1> 404页面问题
由于前面的配置将路径以”.php”结尾的请求发送给php
这就会导致如果用户请求的PHP文件不存在时,服务器返回错误提示,而不是原来的404页面
2> PATHINFO问题
PATHINFO是apache支持的一种参数传递机制
它是一个url地址中,从一个有效的php脚本文件名到url参数之间的部分
–PATHINFO的作用
通常用于在某个脚本后面添加一些自定义内容
网站利用这些内容可以进行seo优化或增强用户体验
–注意:
php在apache中是以模块方式工作的.而在nginx环境下以cgi方式工作的
在php.ini中,默认开启了cgi.fix.pathinfo
用于在CGI模式下自动识别PAHTINFO
–之前这个配置有个安全问题,已修复

—–如何利用nginx解决上面两个问题
原因:请求服务器中不存在php文件导致的问题
因此.利用nginx提供的try_files指令先检测文件是否存在即可

syntax: try_files $uri = 404
context:location

try_files指令用法:

参数数量可以多个,每个参数表示一个文件路径
try_files会从左到右依次检测给定的文件路径是否存在
如果存在则发生内部重定向,跳出当前location并重新匹配
–$uri是内置变量
try_files的最后一个参数可以是状态码 如”=404”表示返回404,如果最后一个参数还是文件路径,在文件不能存在时会返回500错误

–当前配置的含义:
当用户试图访问一个以”.php”结尾且文件不存在时,
nginx会优先返回404页面,并且不会发送给php执行
这样就同时解决了404页面和PATHINFO的问题

—–经验收货
–路由是把信息从源穿过网络传递到目的的行为,在路上,至少遇到一个中间节点。路由通常与桥接来对比,在粗心的人看来,它们似乎完成的是同样的事。它们的主要区别在于桥接发生在OSI参考协议的第二层(链接层),而路由发生在第三层(网络层)。这一区别使二者在传递信息的过程中使用不同的信息,从而以不同的方式来完成其任务。
–route命令用来显示并设置Linux内核中的网络路由表,route命令设置的路由主要是静态路由。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。
–网卡临时启动 ifup eth0
—假如在nat模式下,静态ip时候 ping不通外网时
看看 dns是不是设置成了物理机的虚拟网卡ip或者设置虚拟网卡网关的ip
(nat下的dns不能设置成8.8.8.8这些外网dns)
然后看看route有木有 default这路由表或者显示网络不可达
没有的话 临时启用 就 route add default gw 物理机的虚拟网卡ip
–永久route /etc/rc.local 或 /etc/sysconfig/static-routes
–查看dns cat /etc/resolve.conf
–broadcast是广播 gateway才是网关

猜你喜欢

转载自blog.csdn.net/eebaicai/article/details/81177474