[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.repo 或 remi.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-dir或php -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)程池,這樣在命令行中使用 top 或 ps 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_log 和 root 改為適當(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ā)給這個虛擬主機。indexHTTP 請求 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