内容简介:假如你有依照2.1 節的設定,現在打開本機的瀏覽器,連到Nginx 預設的文件目錄在
LNMP
4.1 啟動 Nginx
# 安裝 Nginx sudo yum update sudo yum install epel-release sudo yum install nginx # 啟動 systemctl start nginx # 開機時啟動 systemctl enable nginx # 查看狀態 systemctl status nginx
假如你有依照2.1 節的設定,現在打開本機的瀏覽器,連到 http://192.168.8.8
應該可以看到 Nginx 的預設首頁。
4.2 Nginx 文件目錄的權限設定
Nginx 預設的文件目錄在 /usr/share/nginx/html
。在開始加入自己的網頁之前,要先做幾個動作來確保 Nginx 在讀取網頁時能夠順利。
# 將 nginx 群組加入成為 tony 帳號的次要群組 sudo usermod -aG nginx tony # 查看 tony 帳號的群組 groups tony # 結果 tony : tony nginx # <-- 多了一個 nginx # 將 /usr/share/nginx 之下的目錄及檔案擁有者改為 nginx:nginx cd /usr/share/nginx sudo chown -R nginx:nginx * # 將 /usr/share/nginx/html 目錄及其下的子目錄加入群組寫入的權限 cd /usr/share/nginx sudo chmod -R g+w html # 設定 SELinux 權限 chcon -Rv --type=httpd_sys_content_t /usr/share/nginx # 檢查 html 及其下檔案及目錄是否有 httpd_sys_content_t 這個權限 ls -Z /usr/share/nginx
我們將自己的帳號加入 nginx 群組,並將群組指定為有寫入的權限,可以避免在新增網頁時出現問題。
CentOS 的 SELinux 有時候會造成 Nginx 沒有讀取的權限,這時當你在瀏覽器開啟網頁時可能會出現 502 Bad Gateway 的錯誤。SELinux 是 Security Enhanced Linux 的縮寫,目的就是對 Linux 做安全強化,對 SELinux 來說,檔案或目錄必須有 httpd_sys_content_t
這個權限,Nginx 才能正常讀取。
SELinux 是針對程式做權限控管而非使用者,所以即使是以 root 身分操作某支程式去執行某個動作,只要該程式沒有對該目錄或行為有權限,就無法執行。例如只要該目錄或檔案沒有 httpd_sys_content_t
的權限,Nginx 程式便無法讀取,這樣可以防止 Nginx 這個程式隨意讀取其他系統上的目錄或檔案,形成保護的機制。
4.3 啟動 PHP-FPM
4.3.1 安裝
CentOS 內建的套件庫所提供的 PHP 版本有點舊,只有到第 5 版,我們必須安裝額外的套件庫才能安裝最新版本的 PHP。首先要安裝 EPEL ,接著安裝其他有提供最新 PHP 版本的倉庫,例如 Webtatic 或 IUS 。
# 先安裝 EPEL sudo yum install epel-release # 或以 rpm 檔的方式安裝 # CentOS 7 sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm # CentOS 6 sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm # 接著選擇一個倉庫來安裝 # 安裝 Webtatic 倉庫 # CentOS 7 sudo yum install https://mirror.webtatic.com/yum/el7/webtatic-release.rpm # CentOS 6 sudo yum install https://mirror.webtatic.com/yum/el6/latest.rpm # 或安裝 IUS 倉庫 # CentOS 7 sudo yum install https://centos7.iuscommunity.org/ius-release.rpm # CentOS 6 sudo yum install https://centos6.iuscommunity.org/ius-release.rpm
安裝完成後,就可以來安裝 php-fpm 了。這裡要說明一下套件名稱,Webtatic 的套件名稱會以 w
結尾,IUS 則是以 u
結尾。
# 列出所有版本的 php-fpm yum list php*-fpm # 可能的結果如下
好吧,我們先來移除舊版本的再安裝 IUS 提供的新版本:
# 套件會有關聯性,所以這兩個套件必須同時移除 sudo yum remove php72w-fpm php72w-common # 安裝套件 sudo yum install php72u-fpm # php72u-fpm 套件依賴 php72u-common,所以它也會被要求安裝 # 啟動 php-fpm 伺服器 sudo systemctl start php-fpm # 開機時啟動 sudo systemctl enable php-fpm # 都安裝好之後,來查看安裝了哪些 PHP 套件 yum list installed | grep php
其他和 PHP 相關的套件:
mod_php72u
:Apache HTTP 伺服器的模組,如果你使用 Apache 的話,必須安裝此套件。
php72u-cli
:可以執行 PHP 腳本程式的命令列工具。
php72u-pdo
:提供存取 MySQL 、PostgreSQL 等資料庫的抽象層介面。
php72u-mysqlnd
:提供原生 MySQL 存取驅動程式。
php72u-opcache
:快取功能。
php72u-mbstring
:支援雙位元的字串。
註: mcrypt
套件在 PHP 7.1.0 版開始被棄用,因為有安全上的問題,建議改用 Sodium (PHP 7.2.0 之後) 或 OpenSSL 。
你可以一次安裝全部的套件:
sudo yum -y install php72u-fpm php72u-cli php72u-mbstring php72u-mysqlnd php72u-pdo php72u-opcache php72u-sodium
4.3.2 關於 cgi.fix_pathinfo 的問題
在較舊版本的 Nginx 和 php-fpm 搭配使用時,會有個 cgi.fix_pathinfo
的漏洞引起安全上的問題,現在可以透過使用新版本加上設定來避免。
Nginx 會有許多以 $
開頭的 環境變數 ,在它接收到請求時,URI 會被 $fastcgi_script_name 環境變數取出成為 SCRIPT_FILENAME
及 PATH_TRANSLATED
兩個參數,然後傳遞給 php-fpm 來使用。
PHP 的配置檔中, cgi.fix_pathinfo
選項預設是開啟的 (值為 1) ,它可以用來取出 Nginx 所傳過來的 SCRIPT_FILENAME
中的腳本名稱。
漏洞是這麼發生的,Nginx 將它所解析的 SCRIPT_FILENAME
傳給 php-fpm,而 php-fpm 全然接受 Nginx 所傳過來的結果,但是 Nginx 不知道其實它被騙了,就傳了個有問題的腳本名稱給 php-fpm,而 php-fpm 找到這個腳本執行後,就出問題了。
舉例:當你的網站允許上傳圖檔 (或其他類型的檔案),某人將 bad.php 改名成 bad.jpg 後上傳,於是它可以這樣連入網址 http://myweb.com/bad.jpg/a.php ,實際上並沒有 a.php ,是故意亂打的,在 cgi.fix_pathinfo
啟用的情況下,因為找不到 a.php,會往前找 bad.jpg,發現有找到於是執行,如果它是一張正常的圖片就會直接顯示,但是因為它是 bad.php 的偽裝,於是就執行了其中的 php 程式碼。
這是個存在很久的問題,早期的解法是將 cgi.fix_pathinfo
禁用來解決,例如:
# 編輯 php.ini sudo vim /etc/php.ini # 搜尋 cgi.fix_pathinfo /cgi.fix_pathinfo # 預設是啟用的,將其註解取消並改為 0 # 將 ;cgi.fix_pathinfo=1 # 改成 cgi.fix_pathinfo=0
現在己經不推薦這個做法,因為它會讓 PHP_SELF
這個全域變數壞掉,有用到此變數的系統就無法正常運作。
Nginx 上有提到 正確的做法 ,請在使用到 PHP 的虛擬主機加上以下設定:
server { # ...略 location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; if (!-f $document_root$fastcgi_script_name) { return 404; } # 如果你的 php-fpm 使用 socket 請使用下面這行 # fastcgi_pass unix:/var/run/php-fpm.sock; # 如果使用 TCP 則使用下面這行,2 選 1 fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; # 加入 fastcgi_param 檔案的設定 include fastcgi_params; # 假如 fastcgi_params 中沒有以下內容,請額外加入 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }
在 /etc/nginx
目錄下可以找到 fastcgi_params
這個檔案。
4.3.3 調整 php-fpm 設定
php-fpm 的設定檔在 /etc/php-fpm.d/www.conf
它使用 ;
當註解,我們要針對 Nginx 做一些調整:
sudo vim /etc/php-fpm.d/www.conf # 程序的使用者及群組 # 23, 24 行,改成 user = nginx group = nginx # 如何接受 FastCGI 請求 # 36, 40 行,2 選 1 listen = 127.0.0.1:9000 # TCP listen = /var/run/php-fpm/php-fpm.sock # Socket # 這裡的選擇會影響到 Nginx 中虛擬主機的 fastcgi 設定 # 對照設定如下 # fastcgi_pass 127.0.0.1:9000; # TCP # fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; # Socket # 如果你前面選擇使用 Socket 接受請求的方式,才須做以下設定 # 如果沒有,預設會使用當前使用者的權限 # 設定 socket 的權限 # 50 ~ 52 行 listen.owner = nginx # 設定為 nobody 也可以 listen.group = nginx # 設定為 nobody 也可以 listen.mode = 0660 # 存檔離開 # 重新啟動 PHP-FPM sudo systemctl restart php-fpm # 重新啟動 Nginx sudo systemctl restart nginx
註:在 vim 中顯示行號的方法: esc -> :set nu
,行號可能會略有不同,但是方便你大概知道在文件的哪個位置。
使用 TCP 或 Socket 接受 FastCGI 請求有什麼差別?使用 Socket 必須讓 Nginx 和 php-fpm 處於同一台機器,兩者視為一體,機器上的 CPU 和 RAM 會共享,當要橫向擴充時,也是一起被複製到新的機器上;使用 TCP 則是兩者解耦,一台機器上的 Nginx 可以將資料傳遞給多台機器上的 php-fpm,形成 php-fpm 叢集。
下一章,我們將會設定 Nginx 來建立虛擬主機。
以上所述就是小编给大家介绍的《動手學 VPS 架站:使用 CentOS 7 + Nginx + PHP-FPM + MariaDB (7) - 網頁伺服器》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 讀書筆記 - CentOS 7.3 建置、管理與伺服器架設實戰
- 管理 Redis 伺服器的利器:Redis Desktop Manager (原始碼建置筆記)
- 如何在 Angular CLI 建立的專案加入 Angular Universal 伺服器渲染功能
- RecyclerView使用指南(一)—— 基本使用
- 如何使用Meteorjs使用URL参数
- 使用 defer 还是不使用 defer?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Beginning Apache Struts
Arnold Doray / Apress / 2006-02-20 / USD 44.99
Beginning Apache Struts will provide you a working knowledge of Apache Struts 1.2. This book is ideal for you Java programmers who have some JSP familiarity, but little or no prior experience with Ser......一起来看看 《Beginning Apache Struts》 这本书的介绍吧!