ubuntu16.04下nginx,apache,php-fpm配置

昨天在ubuntu16.04下安装了lamp,一切正常,想着再装个nginx服务器来玩下

  • 先是下载安装了nginx,php-fpm
sudo apt-get install nginx
sudo apt-get install php-fpm
关于php-fpm 作用,我的简单理解是:
`client->nginx->php-fpm->php-cgi`
  • 但nginx与apache2如何共存呢?改端口号,我的想法是把nginx端口号改为8080,apache不变80。
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。

  • 配置nginx与php:
    nginx与fastcgi通信有2种方式:socket和TCP
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
# 在里面输入<?php phpinfo();
# 浏览器访问localhost:8080/

apache2 与 php-fpm

apt-get install 安装的apache2与php,默认的方式(基本不用配置就成功了)是php作为apache的一个模块,这样效率貌似不高,我便试着换成php-fpm方式。

  • 加载模块
    apache用php-fpm方式要加载两个模块mod_proxy.so
    mod_proxy_fcgi.so,先要Load这两个模块。
    笔者在这里弄了很久,因此第一次接触这样的apache目录结构
#       /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-availableconf-enabledsites-availablesites-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
  • 在虚拟主机文件 加入 php-fpm 处理方式
## 查看是否引入了虚拟主机配置文件
ll /etc/apache2/sites-enabled
## 显示
000-default.conf -> ../sites-available/000-default.conf
## 修改000虚拟主机配置文件
sudo vim /etc/apache2/sites-available/000-default.conf
## 在<VirtualHost *:80>内加上
## 这里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
  • 测试: 访问localhost/index.php
    注意phpinfo页面,ctrl+f搜索Server API,其值变成了FPM/FastCGI,原本是Apache 2.0 Handler的

总结

对apache这种目录结构了解了,配置虚拟主机,加载模块没问题了,服务器与php交互的3种方式大概懂了。

参考链接

猜你喜欢

转载自blog.csdn.net/kbellx/article/details/78980317