CentOS7.5+PHP5.6.36+Nginx1.14.0配置筆記

sage6437發表於2018-05-25

本文首發 http://zhaoda.net/2018/05/22/centos-php-nginx/
轉載請註明出處

建立使用者、組和目錄

# web 使用者和組
groupadd www
useradd -g www www -s /sbin/nologin

# 網站目錄
mkdir -p /data/htdocs

# 日誌目錄
mkdir -p /data/logs

# 建立軟體包下載和編譯目錄,後續軟體都下載到這裡
mkdir -p /data/software

# 建立軟體安裝目錄,PHP、Nginx 將安裝到這裡
mkdir -p /usr/local/webserver

# 可寫目錄進行如下設定
# chown -R www:www /path

伺服器基礎環境和依賴安裝

# 如果系統自帶 Apache、PHP、MySQL,先解除安裝
yum remove httpd
yum remove php
yum remove mysql

# 升級所有軟體包
yum update -y

# 安裝可能用到的軟體包,大部分其實已經內建在系統中
# gcc:GNU 編譯器套裝
# gcc-c++:GCC 的 C++ 支援
# autoconf:在sh下製作供編譯、安裝和打包軟體的配置指令碼的工具
# libjpeg-turbo-static:處理 JPEG 影像資料格式的自由庫
# libpng:處理 PNG 影像資料格式的自由庫
# freetype: 字型光柵化庫
# libxml2: 解析XML文件的函式庫
# zlib: 提供資料壓縮之用的庫
# glibc:C函式庫
# glib2:跨平臺的、用C語言編寫的五個底層庫的集合
# bzip2:比傳統的 gzip 或者 ZIP 的壓縮效率更高的庫
# ncurses:虛擬終端中的“類GUI”應用軟體工具箱
# curl:利用URL語法在命令列下工作的檔案傳輸工具
# e2fsprogs:用以維護ext2,ext3和ext4檔案系統的工具程式集
# krb5-libs:網路身份驗證系統
# libidn:通過IETF國際域名(IDN)實施字串預處理、Punycode 和 IDNA規格定義的工具
# openssl:安全通訊軟體包
# openldap:輕型目錄訪問協議
# nss-pam-ldapd:使用目錄伺服器的 nsswitch 模組
# openldap-clients:LDAP 客戶端實用工具
# openldap-servers:LDAP 服務
# bison:自動生成語法分析器程式
# lrzsz:遠端上傳和下載檔案
# libmcrypt:mcrypt 演算法庫
# mhash:mhash 演算法庫
# ImageMagick:用於檢視、編輯點陣圖檔案以及進行影像格式轉換的開放原始碼軟體套裝
# libmemcached: memcache 客戶端
yum -y install gcc gcc-c++ autoconf libjpeg-turbo-static libjpeg-turbo-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel pcre pcre-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5-libs krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss-pam-ldapd openldap-clients openldap-servers bison lrzsz libmcrypt libmcrypt-devel mcrypt mhash ImageMagick ImageMagick-devel libmemcached libmemcached-devel

安裝其他 PHP 依賴庫

# libiconv:提供了一個iconv()的函式,以實現一個字元編碼到另一個字元編碼的轉換
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz
tar zxvf libiconv-1.15.tar.gz
cd libiconv-1.15
./configure --prefix=/usr/local
make
make install

# 在 /etc/ld.so.conf 加一行 /usr/local/lib,再執行如下
/sbin/ldconfig

安裝 PHP

# 下載並解壓
wget http://cn2.php.net/get/php-5.6.36.tar.gz/from/this/mirror -O php-5.6.36.tar.gz
tar zxvf php-5.6.36.tar.gz
cd php-5.6.36

# 編譯安裝
# 記憶體如果小於1G,增加 --disable-fileinfo
./configure --prefix=/usr/local/webserver/php --with-config-file-path=/usr/local/webserver/php/etc --with-mysql --with-mysqli --with-curl --with-mcrypt --with-gd --with-openssl --with-mhash --with-xmlrpc --with-gettext --with-bz2 --with-zlib --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-libxml-dir --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --enable-mbregex --enable-mbstring --enable-gd-native-ttf --enable-pcntl --enable-sockets --enable-zip --enable-soap --enable-ftp --enable-exif --enable-opcache --enable-fpm --with-fpm-user=www --with-fpm-group=www --without-pear

# 如果遇到 undefined reference to `libiconv_open` 錯誤
# make 後面增加 ZEND_EXTRA_LIBS=`-liconv`
make ZEND_EXTRA_LIBS=`-liconv`
make install

# 建立配置檔案
cp php.ini-production /usr/local/webserver/php/etc/php.ini

# 複製啟動指令碼到 init.d 目錄並修改許可權
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod 700 /etc/init.d/php-fpm

# 設定開機啟動
chkconfig php-fpm on

# 檢視開機啟動服務
chkconfig --list

# 啟動服務
service php-fpm start

# 停止服務
service php-fpm stop

# 重啟服務
service php-fpm reload

# 建立軟連線,方便全域性執行 php-fpm start | stop | reload
ln -s /usr/local/webserver/php/bin/php /usr/bin/php
ln -s /etc/init.d/php-fpm /usr/bin/php-fpm

安裝 PHP 擴充套件

# memcache 擴充套件
# memcached 支援 Binary Protocol,而 memcache 不支援,意味著 memcached 會有更高的效能
# https://pecl.php.net/package/memcached
# 3.x.x 支援 php 7,2.x.x 支援 php 5.2-5.6
wget https://pecl.php.net/get/memcached-2.2.0.tgz
tar zxvf memcached-2.2.0.tgz
cd memcached-2.2.0
/usr/local/webserver/php/bin/phpize
./configure --with-php-config=/usr/local/webserver/php/bin/php-config
make
make install

# 如果需要再本地快取業務側資料,安裝 apcu
# apc 包含 opcode 快取和 KV 資料快取
# PHP 5.5.0 及後續版本中已經繫結了 OPcache 擴充套件,所以不需要安裝 apc
# apcu 只包含 KV 資料快取
# https://pecl.php.net/package/APCu
wget https://pecl.php.net/get/apcu-4.0.11.tgz
tar zxvf apcu-4.0.11.tgz
cd apcu-4.0.11
/usr/local/webserver/php/bin/phpize
./configure --with-php-config=/usr/local/webserver/php/bin/php-config
make
make install

# 圖片處理 ImageMagick 擴充套件
# https://pecl.php.net/package/imagick
wget https://pecl.php.net/get/imagick-3.4.3.tgz
tar zxvf imagick-3.4.3.tgz
cd imagick-3.4.3
/usr/local/webserver/php/bin/phpize
./configure --with-php-config=/usr/local/webserver/php/bin/php-config
make
make install

修改 php.ini 配置檔案

; vi /usr/local/webserver/php/etc/php.init

; 該選項設定為 On 時,將在所有的指令碼中使用輸出控制
output_buffering = On

; 將 PHP 所能開啟的檔案限制在指定的目錄樹
open_basedir = /data/htdocs/:/tmp/

; 禁用函式
disable_functions = system,passthru,shell_exec,escapeshellarg,escapeshellcmd,proc_close,proc_open,proc_get_status,dl,chroot,show_source,syslog,readlink,symlink,popepassthru,stream_socket_server

; 禁止暴露 PHP 被安裝在伺服器上
expose_php = Off

; 禁止錯誤資訊輸出
display_errors = Off

; 錯誤資訊記錄到伺服器錯誤日誌
log_errors = On

; 設定指令碼錯誤將被記錄到的檔案
; 該檔案必須是web伺服器使用者可寫的
; mkdir /data/logs
; touch /data/logs/php_error.log
; chown www:www /data/logs/php_error.log
error_log = /data/logs/php_error.log

; 傳遞給儲存處理器的引數
session.save_path = "/tmp"

; 防止 Nginx 檔案型別錯誤解析漏洞
cgi.fix_pathinfo = 0

; 檔案上傳臨時目錄
upload_tmp_dir = /tmp

; 時區
date.timezone = "Asia/Shanghai"

; 允許使用 PHP 程式碼開始標誌的縮寫形式
short_open_tag = On

; php 擴充套件目錄
; php 5.2
; extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/"
; php 5.4
; extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20100525/"
; php 5.5
; extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20121212/"
extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20131226/"

; 檔案結尾新增擴充套件配置,按需新增
[apcu]
extension = "apcu.so"
apc.enabled = on
apc.shm_size = 256M
apc.enable_cli = on
[memcached]
extension = "memcached.so"
[imagick]
extension = "imagick.so"
[opcache]
zend_extension="opcache.so"
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

修改 php-fpm.conf 配置檔案

; cp /usr/local/webserver/php/etc/php-fpm.conf.default /usr/local/webserver/php/etc/php-fpm.conf
; vi /usr/local/webserver/php/etc/php-fpm.conf
; 查詢並修改如下配置,其他保持預設

; 錯誤日誌的位置
error_log = /data/logs/php-fpm.log
; 錯誤級別
log_level = error
; 如果子程式在設定的時間內收到該引數設定次數的 SIGSEGV 或者 SIGBUS退出資訊號,則FPM會重新啟動
emergency_restart_threshold = 10
; 用於設定平滑重啟的間隔時間
emergency_restart_interval = 1m
; 設定子程式接受主程式複用訊號的超時時間
process_control_timeout = 5s
; 設定 FPM 在後臺執行
daemonize = yes
; 設定允許連線到 FastCGI 的伺服器 IPV4 地址
listen.allowed_clients = 127.0.0.1
; 子程式的數量是固定的
pm = static
; pm 設定為 static 時表示建立的子程式的數量
pm.max_children = 64
; 設定啟動時建立的子程式數目。僅在 pm 設定為 dynamic 時使用
pm.start_servers = 10
; 設定空閒服務程式的最低數目。僅在 pm 設定為 dynamic 時使用
pm.min_spare_servers = 10
; 設定空閒服務程式的最大數目。僅在 pm 設定為 dynamic 時使用
pm.max_spare_servers = 30
; 設定每個子程式重生之前服務的請求數
pm.max_requests = 500
; FPM 狀態頁面的網址
pm.status_path = /phpfpm_status
; 設定單個請求的超時中止時間
request_terminate_timeout = 30
; 設定檔案開啟描述符的 rlimit 限制
rlimit_files = 65535
; 禁止輸出錯誤資訊
php_flag[display_errors] = off

啟動 php

# 修改檔案控制程式碼數為 65535
ulimit -SHn 65535

# 啟動 php-cgi 程式
# 監聽 127.0.0.1 的 9000 埠
# 程式數為 64(如果伺服器記憶體小於3GB,可以只開啟64個程式)
# 使用者為www
php-fpm start

安裝 nginx

wget http://nginx.org/download/nginx-1.14.0.tar.gz
tar zxvf nginx-1.14.0.tar.gz
cd nginx-1.14.0/
# --prefix=PATH:指定nginx的安裝目錄
# --user=name:設定nginx工作程式的使用者
# --group=name:設定nginx工作程式的組
# --with-pcre:設定PCRE庫的原始碼路徑,如果已通過 yum 方式安裝,使用 --with-pcre 自動找到庫檔案
# --with-http_stub_status_module:用來監控 Nginx 的當前狀態
# --with-http_ssl_module:使用https協議模組
# --with-http_realip_module:通過這個模組允許我們改變客戶端請求頭中客戶端IP地址值
# 更多配置參考 https://tengine.taobao.org/nginx_docs/cn/docs/install.html

./configure --prefix=/usr/local/webserver/nginx --user=www --group=www --with-pcre --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
make
make install

ln -s /usr/local/webserver/nginx/sbin/nginx /usr/bin/

升級 nginx

# make 之後不要 make install
mv /usr/local/webserver/nginx/sbin/nginx /usr/local/webserver/nginx/sbin/nginx.old
cp objs/nginx /usr/local/webserver/nginx/sbin/
nginx -t
kill -USR2 `cat /usr/local/webserver/nginx/logs/nginx.pid`
kill -QUIT `cat /usr/local/webserver/nginx/logs/nginx.pid.oldbin`
nginx -v

修改 nginx.conf 配置檔案

Nginx 配置檔案主要分成四部分:main(全域性設定)、server(主機設定)、upstream(上游伺服器設定,主要為反向代理、負載均衡相關配置)和 location(URL匹配特定位置後的設定),每部分包含若干個指令。main 部分設定的指令將影響其它所有部分的設定;server 部分的指令主要用於指定虛擬主機域名、IP 和埠;upstream 的指令用於設定一系列的後端伺服器,設定反向代理及後端伺服器的負載均衡;location 部分用於匹配網頁位置(比如,根目錄“/”,“/images”,等等)。他們之間的關係式:server 繼承 main,location 繼承 server;upstream 既不會繼承指令也不會被繼承,它有自己的特殊指令,不需要在其他地方的應用。

# vi /usr/local/webserver/nginx/conf/nginx.conf
# 查詢並修改如下配置,其他保持預設

# 執行的使用者和使用者組
user  www www;
# 全域性錯誤日誌和級別
error_log  /data/logs/nginx_error.log  error;
# 程式檔案
pid  /usr/local/webserver/nginx/logs/nginx.pid;
# 單個程式開啟的最多檔案描述符數目
worker_rlimit_nofile 65535;

events 
{
    # 事件模型,epoll模型是Linux 2.6以上版本核心中的高效能網路I/O模型
    use epoll;
    # 單個程式可以處理的最大連線數
    worker_connections 65535;
}

http {
    # 日誌名稱和格式
    log_format  main  `$remote_addr - $remote_user [$time_local] "$request" `
                      `$status $body_bytes_sent "$http_referer" `
                      `"$http_user_agent" "$http_x_forwarded_for"`;
    # 允許客戶端請求的最大單檔案位元組數
    client_max_body_size 8m;
    # 防止網路阻塞
    tcp_nopush on;
    # 開啟gzip壓縮
    gzip on;
    # 隱藏 nginx 的版本資訊
    server_tokens off;
    # 包含其它自定義虛擬主機配置檔案
    # mkdir /usr/local/webserver/nginx/conf/vhost
    include vhost/*.conf;

    # 註釋掉 server { } 部分的預設配置
}

nginx 開機啟動

# vi /etc/rc.local
/usr/local/webserver/nginx/sbin/nginx

# 測試
# nginx -t
# 重啟和停止
# nginx -s reload | stop

Nginx 站點加密

  • 建立指令碼 vi /usr/local/sbin/htpasswd.pl,輸入
#!/usr/bin/perl
use strict;
my $pw=$ARGV[0] ;
print crypt($pw,$pw)."
";
  • 生成密碼
chmod +x /usr/local/sbin/htpasswd.pl
# passwd 是要生成的密碼
/usr/local/sbin/htpasswd.pl passwd
# 建立完成後刪除 htpasswd.pl
  • 建立存放使用者名稱和密碼的檔案 vi /usr/local/webserver/nginx/conf/.htpasswd
  • 輸入 user:passwd,user 是使用者名稱,passwd 是剛才生成的密碼
  • 在需要加密的 server 或者 location 中增加如下配置
auth_basic    "login...";
auth_basic_user_file    /usr/local/webserver/nginx/conf/.htpasswd

https ssl 證照配置

  • 如果需要建立一個伺服器監控和管理站點,用來檢視 phpinfo 或 nginx 狀態等資訊,建議將該站點設定密碼和 https 訪問
# 替換下面的 example.com 為你的伺服器運維域名
mkdir -p /usr/local/webserver/nginx/conf/ssl
cd /usr/local/webserver/nginx/conf/ssl
openssl genrsa -des3 -out example.com.key 1024 795dsl
## 輸入密碼、確認密碼
openssl req -new -key example.com.key -out example.com.csr
## 分別輸入之前設定的密碼、CN、Beijing、Beijing、example.com、example.com、*.example.com、郵箱、回車、回車
cp example.com.key example.com.key.org
openssl rsa -in example.com.key.org -out example.com.key
## 輸入之前設定的密碼
openssl x509 -req -days 365 -in example.com.csr -signkey example.com.key -out example.com.crt
  • 在需要開啟 https 的 server 或者 location 中增加如下配置
    ssl on;
    ssl_certificate ssl/example.com.crt;
    ssl_certificate_key ssl/example.com.key;

配置運維站點

  • 替換下面的 example.com 為你的伺服器運維域名
  • 建立站點配置檔案 vi /usr/local/webserver/nginx/conf/vhost/example.com
server
{
    listen 80 default;
    server_name    _;
    access_log  off;
    deny all;
}

server
{
    listen 8080 default;
    server_name    _;
    access_log  off;
    deny all;
}

server {
    listen 80;
    server_name example.com;
    index index.html index.htm index.php;
    root  /data/htdocs/example.com;

    location / {
        rewrite ^(.*) https://$server_name$1 permanent;
    }
    access_log  off;
}

server
{
    listen    443;
    server_name  example.com;
    if ($host != `example.com`) {
        rewrite    ^/(.*)$    http://www.example.com/    permanent;
    }
    index index.html index.htm index.php;
    root  /data/htdocs/example.com;

    ssl on;
    ssl_certificate ssl/example.com.crt;
    ssl_certificate_key ssl/example.com.key;
    
    auth_basic    "login...";
    auth_basic_user_file  /usr/local/webserver/nginx/conf/.htpasswd;

    location /status {
        stub_status on;
    }

    location /phpfpm_status {
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param  HTTPS on;
        include fastcgi.conf;    
    }

    location ~ .(php|php5)?$
    {      
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param  HTTPS on;
        include fastcgi.conf;
    }
    
    location ~ .(gif|jpg|jpeg|png|bmp|swf|js|css)$
    {
        expires      30d;
    }

    access_log  off;
}
  • 建立站點目錄 mkdir /data/htdocs/example.com,建立以下檔案
  • index.html
<html>
<head>
<title>example.com</title>
</head>
<body>
<ul>
<li><a href="/status" target="_blank">status</a></li>
<li><a href="/phpfpm_status" target="_blank">phpfpm_status</a></li>
<li><a href="/phpinfo.php" target="_blank">phpinfo</a></li>
<li><a href="/ocp.php" target="_blank">opcache</a></li>
<li><a href="/apc.php" target="_blank">apcu</a></li>
</ul>
<div><iframe src="/status" style="width: 400px; height: 100px;"></iframe></div>
<div><iframe src="/phpfpm_status" style="width: 400px; height: 240px;"></iframe></div>
</body>
</html>
  • phpinfo.php
<?phpinfo();?>

重啟並測試

nginx -s reload
php-fpm reload

上面配置的運維域名如果沒有解析,可以到 /etc/hosts 中配置,然後訪問 https://運維域名 看個頁面輸出是否正確;如果一切順利,繼續到 /usr/local/webserver/nginx/conf/vhost 中新增站點配置吧


相關文章