2018-11-04

[toc]

在公司的網(wǎng)站上推薦使用 docker 容器來安裝環(huán)境,一個項目一個 docker 容器。

個人網(wǎng)站服務(wù)器隨便你,即使把服務(wù)器搞壞了,可以重裝系統(tǒng),公司的就不行了,因為服務(wù)器上面一定會有其他項目的。

百度百科:https://baike.baidu.com/item/Docker/13344470?fr=aladdin

首先要安裝 epel、remi 源

地址:...

安裝 PHP

現(xiàn)在,我們要從 EPEL 和 remi 倉庫中安裝最新版 PHP 。在安裝之前,我們要知道有哪些可用的 PHP 包,以及各自的作用,PHP 以兩種形式分發(fā);一種是 CLI 包,目的是讓我們在命令行中使用 PHP(我們會以這種形式),另外還有幾個 PHP 包,把 PHP 與 Apache或Nginx Web 服務(wù)器集成在一起。

安裝 PHP CLI 包和 PHP-FPM:

Nginx本身不能處理PHP,它只是個web服務(wù)器,當(dāng)接收到請求后,如果是php請求,則發(fā)給php解釋器處理,并把結(jié)果返回給客戶端。

Nginx一般是把請求發(fā)fastcgi管理進(jìn)程處理,fascgi管理進(jìn)程選擇cgi子進(jìn)程處理結(jié)果并返回給 nginx

一、編譯安裝php-fpm

什么是PHP-FPM

PHP-FPM是一個PHP FastCGI管理器,是只用于PHP的,可以在 http://php-fpm.org/download下載得到.

PHP-FPM其實是PHP源代碼的一個補丁,旨在將FastCGI進(jìn)程管理整合進(jìn)PHP包中。必須將它patch到你的PHP源代碼中,在編譯安裝PHP后才可以使用。

新版PHP已經(jīng)集成php-fpm了,不再是第三方的包了,推薦使用。PHP-FPM提供了更好的PHP進(jìn)程管理方式,可以有效控制內(nèi)存和進(jìn)程、可以平滑重載PHP配置,比spawn-fcgi具有更多優(yōu)點,所以被PHP官方收錄了。在./configure的時候帶 –enable-fpm參數(shù)即可開啟PHP-FPM,其它參數(shù)都是配置php的,具體選項含義可以查看這里。

sudo yum -y --enablerepo=epel,remi,remi-php70 install php-fpm php-cli php-gb php-mbstring php-mcrypt php-mysqlnd php-opcache php-pdo php-devel php-xml;

// 或者是只使用 remi-php70 倉庫
sudo yum -y --enablerepo=remi-php70 install php-fpm php-cli php-gb php-mbstring php-mcrypt php-mysqlnd php-opcache php-pdo php-devel  php-xml;

--enablerepo 這個選項的作用是,告訴 yum 從 EPEL、remi和remi-php70 倉庫中安裝指定的軟件包。沒有這個選項的話,yum 只是使用默認(rèn)的軟件源。--enablerepo=remi 意思是使用 remi 源?;蛘咝薷?/etc/yum.repos.d 文件夾下面的 epel.reporemi.repo 兩個文件中的 enabled=0 屬性,改為 enabled=1.

-y 是指全自動安裝。

搜索 PHP 擴展
yum search php

找到 PHP 擴展列表之后,按照下面演示的方法安裝,你安裝的包或許有所不同

確認(rèn) PHP 是否安裝成功

php -v
報錯

如果報以下錯誤:

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/sqlite3.so' - /usr/lib64/php/modules/sqlite3.so: undefined symbol: sqlite3_errstr in Unknown on line 0
解決方法

You can also run php --ini inside terminal to see which files are used by PHP in CLI mode.(您還可以在終端中運行php --ini,以查看PHP在CLI模式下使用的文件。)

php --'ini'

找到:/etc/php.d/20-sqlite3.ini 配置文件:把 extension=sqlite3.so注釋掉。

EPEL 和 remi 下載 PHP 擴展
sudo yum -y --enablerepo=remi-php70 install 擴展名

// 例如:
sudo yum -y --enablerepo=remi-php70 install php-xdebug
配置文件地址
  • 擴展配置地址:/etc/php.d
    • 查看命令:php --ini
  • 擴展存放目錄:/usr/lib64/php/modules
    • 查看命令:php-config --extension-dirphp -i | grep extension_dir

不啟用擴展在擴展配置文件里面注釋掉即可。

全局配置

在 Ubuntu 中 PHP-FPM 住配置文件所在:etc/php7/fpm/php-fpm.conf;

在 CentOS 中 PHP-FPM 住配置文件所在:etc/php-fpm.conf;

PHP-FPM 的配置文件使用 INI 文件格式。

下面是 PHP-FPM 最重要的全局設(shè)置,我建議把默認(rèn)值改為下面列出的值,默認(rèn)情況下這兩個設(shè)置可能被注釋掉了,如果需要,去掉注釋。這兩個作用是:如果在指定的一段時間內(nèi)優(yōu)指定個子進(jìn)程失效了,讓 PHP-FPM 主進(jìn)程重啟。這是 PHP-FPM 進(jìn)程的進(jìn)本安全保障,能解決簡單的問題,但是不能解決拙劣的 PHP 代碼引起的重大問題。

  • 在指定的一段時間內(nèi),如果實效的 PHP-FPM 子進(jìn)程數(shù)超過這個值,PHP-FPM 主進(jìn)程就優(yōu)雅重啟。

    emergency_restart_threshold = 10
    
  • 設(shè)定 emergency_restart_threshold 設(shè)置采用的時間跨度

    emergency_restart_interval = 1m
    

PHP-FPM 全局設(shè)置的詳細(xì)信息參見:https://php.net/manual/zh/install.fpm.configuration.php

配置進(jìn)程池

PHP-FPM 配置文件其余的內(nèi)容是一個名為 Pool Definitions 的區(qū)域。這個區(qū)域里的配置文件用于設(shè)置每個 PHP-FPM 進(jìn)程池。PHP-FPM 進(jìn)程池中是一系列相關(guān)的 PHP 子進(jìn)程。通常一個 PHP 應(yīng)用有自己的一個 PHP-FPM 進(jìn)程池。

Ubuntu

在 Ubuntu 中 Pool Definitions 區(qū)域只有下面一行內(nèi)容:

include=/etc/php7/fpm/pool.d/*.conf
CentOS

CentOS 則在 PHP-FPM 主配置文件的頂部使用下面的這樣代碼引人進(jìn)程池定義文件:

include=/etc/php-fpm.d/*.conf

這行代碼的作用是讓 PHP-FPM 加載 /etc/php7/fpm/pool.d/目錄(Ubuntu) 或 /etc/php-fpm.d/目錄(CentOS) 中的各個進(jìn)程池定義文件。進(jìn)入這個目錄可以看到有個 www.conf 文件,這是默認(rèn)的 PHP-FPM 進(jìn)程池的配置文件。

每個 PHP-FPM 進(jìn)程池的配置文件開頭都是 "[" 符號,后跟進(jìn)程池的名稱,然后是 "]" 符號。例如:在默認(rèn)的 PHP-FPM 進(jìn)程池的配置文件中,開頭是 "[www]"。

各個 PHP-FPM 進(jìn)程池都已制定的操作系統(tǒng)用戶和用戶組的身份運行。Modern 作者喜歡以非根用戶身份運行各個 PHP-FPM 進(jìn)程池,這樣在命令行中使用 topps aux 命令時便于識別每個 PHP 應(yīng)用的 PHP-FPM 進(jìn)程池。這是個好習(xí)慣,因為每個 PHP-FPM 進(jìn)程池中的進(jìn)程都受相應(yīng)的操作系統(tǒng)用戶和用戶組的權(quán)限限制在沙盒中。

我們要配置默認(rèn)的 www PHP-FPM 進(jìn)程池,讓他以 deploy 用戶和用戶組的身份運行 (如果是 root 用戶請?zhí)^)。

==我建議把一下設(shè)置的默認(rèn)值改為下面設(shè)置的:==

  • 擁有這個 PHP-FPM 進(jìn)程池中子進(jìn)程池的系統(tǒng)用戶,默認(rèn)為 apache,可以改為讓 nginx 去運行,在這里教程是設(shè)置為,非根用戶的用戶名

    user = deploy  
    
  • 擁有這個 PHP-FPM 進(jìn)程池中子進(jìn)程池的系統(tǒng)用戶組,默認(rèn)為 apache,可以改為讓 nginx 去運行

    gropu = deploy 
    
  • PHP-FPM 進(jìn)程池監(jiān)聽的IP地址和端口號,讓 PHP-FPM 只接受 nginx 沖這里傳入的請求。

    listen = 127.0.0.1:9000 
    
  • 可以向這個 PHP-FPM 進(jìn)程池發(fā)送請求的 IP 地址(一個或多個)。為了安全為把這個設(shè)置為:127.0.0.1,即只有當(dāng)前設(shè)備能把請求轉(zhuǎn)發(fā)給這個 PHP-FPM 進(jìn)程池。

    listen.allowed_clients = 127.0.0.1 
    
  • 設(shè)定任何時間點 PHP-FPM 進(jìn)程池中最多能有多少個進(jìn)程,這個設(shè)置沒有絕對正確點值,你應(yīng)該測試你的 PHP 應(yīng)用,確定每個進(jìn)程需要使用多少內(nèi)存,然后把這個設(shè)置設(shè)為設(shè)備可用內(nèi)存能容納的 PHP 進(jìn)程的總數(shù)。對大多數(shù)中小型 PHP 應(yīng)用來說,每個 PHP 進(jìn)程要使用 5~15MB 內(nèi)存。假設(shè)我們使用的設(shè)備為這個 PHP-FPM 進(jìn)程池分配了 512MB 可用內(nèi)存,那么我們可以把這個設(shè)置的值設(shè)為(512MB總內(nèi)存)/(每個進(jìn)程使用10MB) = 51 個進(jìn)程。

    pm.max_children = 51
    
  • PHP-FPM 啟動 PHP-FPM 進(jìn)程池中痢疾可用的進(jìn)程數(shù)。對大多數(shù)中小型 PHP 應(yīng)用來說,我建議設(shè)為 2 或 3.這么做是為了先準(zhǔn)備好兩到三個進(jìn)程,等待請求進(jìn)入,不讓 PHP 應(yīng)用的頭幾個 HTTP 請求等待 PHP-FPM 初始化進(jìn)程池中的進(jìn)程。

    pm.start_servers = 3
    
  • PHP 應(yīng)用空閑時 PHP-FPM 進(jìn)程池中可以存在的進(jìn)程數(shù)量最小值,一般和 pm.start_servers 設(shè)置的值一樣,用于確保新進(jìn)入的 HTTP 請求無需等待 PHP-FPM 在進(jìn)程池中重新初始化進(jìn)程。

    pm.min_spare_servers = 2
    
  • PHP 應(yīng)用空閑時 PHP-FPM 進(jìn)程池中可以存在的進(jìn)程數(shù)量最大值。

    pm.max_spare_serves = 35
    
  • 回收進(jìn)程之前,PHP-FPM 進(jìn)程池中各個進(jìn)程最多能處理的 HTTP 請求的數(shù)量。這個設(shè)置有助于避免 HTTP 擴展或庫因編寫拙劣導(dǎo)致不斷泄露內(nèi)存,為建議設(shè)為 1000

    pm.max_requests = 1000
    
  • 日志文件在文件系統(tǒng)的絕對路徑, PHP-FPM 進(jìn)程池所屬的用戶和用戶組必須有這個文件的寫權(quán)限。

    slowlog = /var/log/php-fpm/www-slow.log
    
  • 如果當(dāng)前 HTTP 請求的處理時間超過指定的值,就把請求的回溯信息寫入 slowlog 設(shè)置指定的日志文件。

    request_slowlog_timeout = 5s
    

編寫保存 PHP-FPM 的配置文件后,要執(zhí)行下述命令==重啟== PHP-FPM 主進(jìn)程:

Ubuntu
sudo service php7-fpm restart
CentOS
// CentOS7 的命令
sudo systemctl restart php-fpm.service

// CentOS6 的命令
sudo /sbin/service php-fpm start
sudo /sbin/service php-fpm restart
9000 被占用報錯

如果在啟動 PHP-FPM 或者是在重啟到時候報以下錯誤:(意思 9000 端口被占用)

[root@jdu4e00u53f7 ~]# /sbin/service php-fpm restart
Stopping php-fpm:                                          [FAILED]
Starting php-fpm: [04-Aug-2017 10:38:50] ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98)
[04-Aug-2017 10:38:50] ERROR: FPM initialization failed
                                                           [FAILED]

查看 9000 端口狀態(tài)

netstat -anp | grep 9000

// 例如:
tcp   0   0 0.0.0.0:9000    0.0.0.0:*    LISTEN      5609/daemon.i686.mo

假如被 daemon.i686.mo 它占用了,殺死它,直接殺死它的 PID 5609:

kill 5609

安裝 MySQL

使用 EPEL6 與 remi 的 yum 源安裝 MySQL 5.5.x

yum --enablerepo=remi install mysql mysql-server

如果是升級MySQL,請用:

yum --enablerepo=remi update mysql mysql-server
如果 MySQl 報錯

如果 MySQL 報以下錯誤:

Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (38)
解決方法

啟用MySQL服務(wù):

/sbin/chkconfig mysqld on

啟動MySQL服務(wù)器:

/sbin/service mysqld start

之后設(shè)置MySQL root密碼:

mysqladmin -u root password 'new-password'

安裝 Nginx

Ubuntu

在 Ubuntu 中可以使用 PPA 包安裝 Nginx。PPA 是 Ubuntu 專用術(shù)語,是指由 nginx 社區(qū)維護且預(yù)先打包好的檔案。

sudo add-apt-repository ppa:nginx/stable;
sudo apt-get update;
sudp apt-get install nginx;
CentOS

在 CentOS 中可以使用前面添加的第三方軟件倉庫 EPEL 安裝 nginx。CentOS 默認(rèn)使用的軟件倉庫可能沒有最新版本的 nginx。

CentOS7 才能使用 systemctl 命令

sudo yum install nginx;
sudo systemctl enable nginx.service; // 系統(tǒng)自動啟動
sudo systemctl start nginx.service; // 立刻啟動服務(wù)

CentOS6 使用以下命令

/sbin/service nginx start  // 立即啟動 nginx
/sbin/service nginx restart //  重啟 nginx

Nginx 虛擬主機

虛擬主機是一系列設(shè)置,用于告訴 nginx 應(yīng)用的域名、PHP 應(yīng)用在文件系統(tǒng)的什么地方,以及如何把 HTTP 請求轉(zhuǎn)發(fā)給 PHP-FPM 進(jìn)程池。

首先,我們必須決定把應(yīng)用放在文件系統(tǒng)的什么位置。非根用戶 deploy 必須擁有 PHP 應(yīng)用所在文件系統(tǒng)目錄的讀寫權(quán)限。這里,我們把應(yīng)用的文件放在 /home/deploy/apps/example.com/current 目錄中。我們還需要一個保存應(yīng)用日志文件的目錄。我們把日志文件放在 /home/deploy/apps/logs 目錄中。

創(chuàng)建所需的目錄,并賦予正確的權(quán)限:

mkdir -p /home/deploy/apps/example.com/current/public;
mkdir -p /home/deploy/apps/logs;
chmod -R +rx /home/deploy;

然后把 PHP 應(yīng)用放到 /home/deploy/apps/example.com.current/ 目錄中。nginx 虛擬主機假設(shè) PHP 應(yīng)用有個 public 目錄,這個是虛擬主機的文檔根目錄。

每個虛擬主機都有各自的配置文件。

  • 如果使用 Ubuntu,請創(chuàng)建 /etc/nginx/sites-available/example.com/ 配置文件;
  • 如果使用 CentOS,請創(chuàng)建 /etc/nginx/conf.d/example.conf 文件。

虛擬主機的設(shè)置在 server{} 塊中,例如:

server {
    listen 80;
    server_name  example.com;
    index index.php index.html index.htm;
    client_max_body_size 50M;
    error_log /home/deploy/apps/logs/example.error.log;
    access_log /home/deploy/apps/logs/example.access.log;
    root  /home/deploy/apps/example.com/current/public;
    
    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
    location ~ \.php {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi_params;
    }
}

復(fù)制上述代碼,粘貼到 example.conf 虛擬主機配置文件中。記得要修改 server_name 設(shè)置,還要把 error_log、access_logroot 改為適當(dāng)?shù)穆窂健?/p>

虛擬機主機設(shè)置
  • listen 設(shè)置 nginx 監(jiān)聽哪個端口進(jìn)入的 HTTP 請求。大多數(shù)情況下,HTTP 流量從 80 端口進(jìn)入,HTTPS 流量從 443 端口進(jìn)入。

  • server_name 用于識別虛擬主機的域名。這個設(shè)置要設(shè)為你的應(yīng)用使用的域名,而且域名要只想服務(wù)器的 IP 地址。如果 HTTP 請求中 Host 首部的值和虛擬機中的 server_name 的值匹配,nginx 就會把這個 HTTP 請求發(fā)給這個虛擬主機。

  • index HTTP 請求 URL 沒指定文件時的默認(rèn)讀取的文件。

  • client_max_body_size 對著虛擬主機來說,nginx 接受 HTTP 請求主體長度的最大值。如果請求住的長度超過這個值,nginx 會返回 HTTP 4xx 響應(yīng)。

  • error_log 這個虛擬主機錯誤日志在文件系統(tǒng)中的路徑。

  • access_log 這個虛擬主機訪問日志文件在文件系統(tǒng)中的路徑。

  • root 文檔根目錄的路徑。

除了上述的設(shè)置之外,server{} 塊中還有兩個 location 塊。作用:告訴 nginx 如何處理匹配指定 URL 模式的 HTTP 請求。

  • location / {} 使用 try_files 指令查找匹配所請求 URI 的文件;如果未找到相應(yīng)的文件,在查找匹配所請求 URI 的目錄;如果也未找到相應(yīng)的目錄,把 HTTP 請求的 URI 重寫為 /index.php,如果查詢字符串的話,還會把查詢字符串加到 URI 的末尾。這個重寫的 URL ,以及所有以 .php 結(jié)尾的 URI,都由 location ~\.php{} 塊管理。

  • location ~\.php {} 把 HTTP 請求轉(zhuǎn)發(fā)給 PHP-FPM 進(jìn)程池處理。還記得嗎,前面我們設(shè)置 PHP-FPM 進(jìn)程池監(jiān)聽端口 9000。在這個塊中,我們把 PHP 請求轉(zhuǎn)發(fā)到端口 9000 ,交給 PHP-FPM 進(jìn)程池處理。

    location ~ \.php {} 塊中其他幾行的作用是避免潛在的遠(yuǎn)程代碼執(zhí)行攻擊。

如果操作系統(tǒng)是 Ubuntu 必須執(zhí)行以下命令,創(chuàng)建虛擬主機配置文件的符號鏈接:

sudo ln -s /etc/nginx/sites-available/example.conf /etc/nginx/sites-enabled/example.cof;

最后,執(zhí)行下述命令:重啟 nginx:

Ubuntu

sudo service nginx restart

CentOS

sudo systemctl restart nginx.service
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections  1024;
}


http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
    
   server {
        listen 80;
        server_name www.mdvtrw.com;
        index index.php index.html index.htm;
        root /var/www/phpub;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
    location ~ \.php {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi_params;
    }
  }

}
報錯
Uncaught SyntaxError: Unexpected token <

意思是nginx沒有配置對,因為沒有讀取到 js。

本章節(jié)是最基礎(chǔ)的設(shè)置,因為這個一個關(guān)于 PHP 的章節(jié),而不是 nginx 章節(jié)。

相關(guān)主題

進(jìn)一步學(xué)習(xí) nginx

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 2018年11月3日 日精進(jìn)。 今日體驗。 今天對于10天的小目標(biāo)進(jìn)行了分解,各個項目具體化,接下來就是...
    凌勝亮閱讀 115評論 0 0
  • 這一章講的是與自我辯駁:如何突破防御性思維的操控? 本來我想做個總結(jié),但是看到有個讀友,寫的總結(jié)很精妙,我就抄下來...
    晚晴_f521閱讀 504評論 0 0
  • 2018-11-03 日精進(jìn)打卡第17天 姓名: 邢宏燕 公司名稱:揚州市興城滋奇齋美食城 組別: 第455期樂觀...
    六項精進(jìn)生活化閱讀 205評論 0 0
  • #白馬聲慢,我自手書# 昨天晚上跟一段時間沒見的阿欣微信視頻,聊了很多,有過去,有回憶,有將來…直到阿欣問起我最近...
    多樂dollor閱讀 348評論 0 0
  • 農(nóng)村有男兒, 身高一米五。 父母已逝世, 和爺奶一起。 靠種田生活, 種蘿卜吃飯。 填飽肚子最好, 不怕沒飯吃。 ...
    我是一個小鉛筆閱讀 196評論 2 0

友情鏈接更多精彩內(nèi)容