-----虚拟主机
–给网卡再绑定一个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 gcc
./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的一个项目,为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS和Scientific 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
–linux版
1> 复制php-fpm.conf文件 /usr/local/php/etc/下
2> 将php-fpm添加到系统服务里面
虽然执行sbin目录下的php-fpm可执行文件可以启动php-fpm,但这种方式比较麻烦
所以采用php在源码包中提供了service方式管理php-fpm是shell脚本
把脚本文件复制到/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(上线环境 安全性较高)
任选一种预设配置复制到php的lib目录中就行
cp php.ini-xxxx /usr/local/php/lib/php.ini
–php.ini文件中有许多复杂的配置,主要是php的核心配置和各种扩展模块的配置
----nginx中配置环境FastCGI变量
–什么是FastCGI变量
举例:
浏览器与服务器之间通过http协议交互时,双方会传递各自的环境信息
nginx和php之间通过FastCGI交互式也需要传递一些信息,这些信息就是环境变量(FastCGI变量)
–在nginx的conf目录中有一个fastcgi.conf文件
该文件中通过fastcgi_param数组型指令保存了一些环境变量
fastcgi_param指令的第一个参数是环境变量名称,第二个参数是对应的值
环境变量的名称和值得格式是有FastCGI接口规定的
主要包含客户端和web服务器的环境信息
–fastcgi.conf和fastcgi_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才是网关