1. 程式人生 > >ubuntu16.04下nginx,apache,php-fpm配置

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.somod_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種方式大概懂了。

參考連結