CentOS7.5+PHP5.6.36+Nginx1.14.0配置筆記
本文首發 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();?>
- ocp.php,https://gist.github.com/ck-on/4959032
- apc.php,https://github.com/krakjoe/apcu/blob/master/apc.php ,修改檔案中的使用者名稱和密碼
重啟並測試
nginx -s reload
php-fpm reload
上面配置的運維域名如果沒有解析,可以到 /etc/hosts
中配置,然後訪問 https://運維域名
看個頁面輸出是否正確;如果一切順利,繼續到 /usr/local/webserver/nginx/conf/vhost
中新增站點配置吧
相關文章
- webpack配置筆記Web筆記
- Linux 核心配置筆記Linux筆記
- logging模組配置筆記筆記
- webpack手動配置筆記Web筆記
- webpack4 + typescript 配置筆記WebTypeScript筆記
- webpack入門筆記——其他配置Web筆記
- Swoft 學習筆記之配置筆記
- Git筆記(3) 安裝配置Git筆記
- Elasticsearch的配置學習筆記Elasticsearch筆記
- Linux 筆記分享十八:網路配置Linux筆記
- 小程式——app.json配置筆記APPJSON筆記
- webpack學習筆記七:配置babelWeb筆記Babel
- Windows 終端環境配置筆記Windows筆記
- 【筆記】Ubuntu 20.04 快速配置 SSH筆記Ubuntu
- Flutter學習筆記 - 安裝,映象,配置Flutter筆記
- Ansible學習筆記——基礎與配置筆記
- Redis筆記01-Redis配置檔案Redis筆記
- 筆記50-Spring簡介和配置筆記Spring
- 【USB筆記】配置描述符Configuration Descriptor筆記
- Docker筆記(三):Docker安裝與配置Docker筆記
- Flutter與Android混合編碼配置筆記FlutterAndroid筆記
- spring上 -基於Xml配置bean筆記SpringXMLBean筆記
- RealSence 驅動及ROS包配置筆記ROS筆記
- 筆記:環境 - Mac配置Host域名對映筆記Mac
- Spring Boot 學習筆記(5):日誌配置Spring Boot筆記
- docker筆記5-阿里雲加速配置Docker筆記阿里
- Xamarin 學習筆記 - 配置環境(Windows & iOS)筆記WindowsiOS
- Redis安裝與配置(學習筆記一)Redis筆記
- Spring Boot 學習筆記(4):配置properties(1)Spring Boot筆記
- Spring Boot 學習筆記(4):配置properties(2)Spring Boot筆記
- 配置Mysql Group Replication遇到的問題筆記MySql筆記
- PVE(Proxmox Virtual Environment) 安裝配置iStoreOS筆記筆記
- SpringBoot系列之YAML配置用法學習筆記Spring BootYAML筆記
- Spring Boot學習筆記:Spring Boot核心配置Spring Boot筆記
- Dubbo | Dubbo快速上手筆記 - 環境與配置筆記
- AI工程師的筆記本環境配置AI工程師筆記
- Apache運維中常用功能配置筆記梳理Apache運維筆記
- Vue 學習筆記 (三) -- VueCli 3 專案配置Vue筆記