昨天在ubuntu16.04下安装了lamp,一切正常,想着再装个nginx服务器来玩下
sudo apt-get install nginx
sudo apt-get install php-fpm
关于php-fpm 作用,我的简单理解是:
`client->nginx->php-fpm->php-cgi`
sudo vim /etc/nginx/sites-available/default
## 第一个listen是ipv4,第二个是ipv6,两个都要改
server {
listen 8080 default_server;
listen [::]:8080 default_server;
若只改ivp4为8080,ipv6仍为80,同时开启Apache2和nginx,都显示正常,但浏览器访问80端口访问的是nignx。
sudo vim /etc/nginx/sites-available/default
#找到 location ~ \.php$ {
# 在里面加上下面其中一种
# TCP方式
fastcgi_pass 127.0.0.1:9000;
# socket方式
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
# 重启nginx
sudo service nginx restart
# 测试配置是否有误
sudo nginx -t
# 改php-fpm配置文件
sudo vim /etc/php/7.0/fpm/pool.d/www.conf
# 也是选其中一种方式,但一定要与nginx选的对应
# tcp方式
listen = 127.0.0.1:9000
# socket方式
listen = /run/php/php7.0-fpm.sock
# 重启php-fpm
sudo service php-fpm restart
# 测试是否有误,显示successful即无误
sudo php-fpm7.0 -t
注意:有些配置文件的注释是";“而不是”#",如上面php-fpm的www.conf
,有时候想注释掉方便切换,下意识就用#,然后开启服务报错…
# 创建index.php
sudo vim /var/www/html/index.php
# 在里面输入
# 浏览器访问localhost:8080/
用apt-get install
安装的apache2与php,默认的方式(基本不用配置就成功了)是php作为apache的一个模块,这样效率貌似不高,我便试着换成php-fpm方式。
mod_proxy.so
与mod_proxy_fcgi.so
,先要Load这两个模块。# /etc/apache2/
# |-- apache2.conf
# | `-- ports.conf
# |-- mods-enabled
# | |-- *.load
# | `-- *.conf
# |-- conf-enabled
# | `-- *.conf
# `-- sites-enabled
# `-- *.conf
以往都是修改apache的配置文件,把模块前的注释去掉就能Load,这次,sudo vim apache2.conf
发现里面并没Load一大堆模块,而是有这个
# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
难道说把模块都放到mods-enabled/
了?前往mods-enabled/
看下
cd /etc/apache2/mods-enabled/
ls -al
发现都是类似这样的连接文件
proxy.load -> ../mods-available/proxy.load
setenvif.conf -> ../mods-available/setenvif.conf
继续前往原文件处
cd /etc/apache2/mods-available
ls -al
一大堆*.load
,*.conf
文件,然后我回到mods-enabled
,发现没有proxy.load
,‘proxy.conf’,再浏览器访问localhost/index.php(里面有phpinfo),搜索页面,没有proxy module,我理解了这种目录结构下的加载模块方式:apache2.conf
引入了mods-enabled/
的文件(而不是mods-available/
),由mods-enabled/ln文件
找到mods-available/各文件
,也就是说没有ln文件,就不会加载对应模块,因此要加载模块只要照葫芦画瓢,建ln文件就行了(这步就相当于以往的取消“#”注释)。至于mods-available/
下的.conf
文件是引入模块处理的规则,.load文
件是实际 LoadModule,打开内容如下
cat /etc/apache2/mods-available/proxy.load
## 显示如下
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
再回头看看/etc/apache2/下的conf-available
,conf-enabled
,sites-available
,sites-enabled
同理,由ln文件来决定是否引入对应内容。笔者认为这样的好处是apache.conf文件看起来简洁了,但引入或取消模块又麻烦了些,要建ln文件…
## 具体操作
sudo ln -s /etc/apache2/mods-available/proxy.conf /etc/apache2/mods-enabled/proxy.conf
sudo ln -s /etc/apache2/mods-available/proxy.load /etc/apache2/mods-enabled/proxy.load
sudo ln -s /etc/apache2/mods-available/proxy_fcgi.load /etc/apache2/mods-enabled/proxy_fcgi.load
## 查看是否引入了虚拟主机配置文件
ll /etc/apache2/sites-enabled
## 显示
000-default.conf -> ../sites-available/000-default.conf
## 修改000虚拟主机配置文件
sudo vim /etc/apache2/sites-available/000-default.conf
## 在内加上
## 这里IfModule 意思是当检测到加载了mod_proxy模块,才执行里面的内容,笔者认为应该要加上mod_proxy_fcgi.c的,但没找到写两个模块的写法..
<IfModule mod_proxy.c>
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/$1
DirectoryIndex /index.php index.php
</IfModule>
## 重启apache2
sudo service apache2 restart
对apache这种目录结构了解了,配置虚拟主机,加载模块没问题了,服务器与php交互的3种方式大概懂了。