Nginx的PHP网站搭建是Nginx与PHP-FPM组合实现的,由于Nginx不支持对PHP动态脚本程序的直接调用或解析,所有的动态脚本程序解析都是通过调用FastCGI接口服务器实现的。
1、PHP环境安装
CentOS 7默认的PHP版本是5.3,我们安装PHP7.4和PHP-FPM。
#!/usr/bin/env bash
#################################################################
#
# 用途: 安装php7.4.25
#
# 日期: 2022-07-18
#
# 作者: moyuanbo
#
#################################################################
# 切换到执行脚本的目录里
cd $(dirname $0)
bash_dir=$(pwd)
# ====================================== 变量修改信息 ======================================
# 执行日志存放路径
[[ -d logs ]] || mkdir logs
execute_log=${bash_dir}/logs/execute.log
# php安装包相关信息
php_tar_dir=php-7.4.25
php_tar_name=${php_tar_dir}.tar.gz
# php启动用户和用户组
default_php_user=nginx
default_php_group=nginx
# php启动端口
default_php_port=9000
# 软件服务存放目录
default_software_dir=/data/software
# php安装目录
default_php_init_dir=${default_software_dir}/php74
# 其他安装包版本信息
# wget https://libzip.org/download/libzip-1.2.0.tar.gz --no-check-certificate
libzip_tar_dir=libzip-1.2.0
libzip_tar_name=${libzip_tar_dir}.tar.gz
# wget https://pecl.php.net/get/igbinary-3.2.7.tgz
igbinary_tar_dir=igbinary-3.2.7
igbinary_tar_name=${igbinary_tar_dir}.tgz
# wget https://pecl.php.net/get/protobuf-3.21.2.tgz
protobuf_tar_dir=protobuf-3.21.2
protobuf_tar_name=${protobuf_tar_dir}.tgz
# wget https://pecl.php.net/get/memcache-4.0.5.2.tgz
memcache_tar_dir=memcache-4.0.5.2
memcache_tar_name=${memcache_tar_dir}.tgz
# wget https://pecl.php.net/get/msgpack-2.1.2.tgz
msgpack_tar_dir=msgpack-2.1.2
msgpack_tar_name=${msgpack_tar_dir}.tgz
# wget https://pecl.php.net/get/hprose-1.8.0.tgz
hprose_tar_dir=hprose-1.8.0
hprose_tar_name=${hprose_tar_dir}.tgz
# wget https://pecl.php.net/get/swoole-4.8.11.tgz
swoole_tar_dir=swoole-4.8.11
swoole_tar_name=${swoole_tar_dir}.tgz
# wget https://pecl.php.net/get/redis-5.3.7.tgz
redis_tar_dir=redis-5.3.7
redis_tar_name=${redis_tar_dir}.tgz
# wget https://github.com/alanxz/rabbitmq-c/releases/download/v0.7.1/rabbitmq-c-0.7.1.tar.gz
librabbitmq_version=0.7.1
librabbitmq_tar_dir=rabbitmq-c-0.7.1
librabbitmq_tar_name=${librabbitmq_tar_dir}.tar.gz
# librabbitmq安装目录
default_librabbitmq_init_dir=/data/apps/${librabbitmq_tar_dir}
# wget https://pecl.php.net/get/amqp-1.11.0.tgz
amqp_tar_dir=amqp-1.11.0
amqp_tar_name=${amqp_tar_dir}.tgz
# php编译安装信息
function php_install_compile_info() {
compile_info="""./configure --prefix=${php_init_dir} \
--with-config-file-path=${php_init_dir}/etc/ \
--with-fpm-user=${php_user} \
--with-fpm-group=${php_group} \
--with-curl \
--enable-gd \
--with-gettext \
--with-iconv-dir \
--with-kerberos \
--with-libdir=lib64 \
--with-mysqli \
--with-openssl \
--with-pdo-mysql \
--with-pdo-sqlite \
--enable-phar \
--with-pear \
--with-xmlrpc \
--with-xsl \
--with-zlib \
--with-bz2 \
--with-mhash \
--enable-fpm \
--enable-bcmath \
--enable-inline-optimization \
--enable-mbregex \
--enable-mbstring \
--enable-opcache \
--enable-pcntl \
--enable-shmop \
--enable-soap \
--enable-sockets \
--enable-sysvsem \
--enable-sysvshm \
--enable-xml \
--enable-fpm \
--with-gnu-ld \
--with-zip \
--with-gmp \
--enable-opcache \
--enable-static"""
}
# ==========================================================================================
function current_time() {
date +"%Y%m%d %H:%M:%S"
}
function shell_lock() {
[[ -d ${bash_dir}/tmp ]] || mkdir tmp
[[ -f ${bash_dir}/tmp/shell.lock ]] && \
echo_error "脚本正在运行,请删除锁文件(tmp/shell.lock)之后再执行该脚本,删除前请确认是否只有本人在操作" && \
exit
touch ${bash_dir}/tmp/shell.lock
}
function shell_unlock() {
[[ -f ${bash_dir}/tmp/shell.lock ]] && \rm -f ${bash_dir}/tmp/shell.lock
}
function error_log() {
echo -e "\e[31;1m[$(current_time)] ${1}\e[0m" | tee -a ${2}
}
function echo_error() {
echo -e "\e[31;1m[$(current_time)] ${1}\e[0m"
}
function succes_log() {
echo -e "\e[32;1m[$(current_time)] ${1}\e[0m" | tee -a ${2}
}
function echo_succes() {
echo -e "\e[32;1m[$(current_time)] ${1}\e[0m"
}
function echo_print() {
echo -e "\e[33;1m[$(current_time)] ${1}\e[0m"
}
function echo_grey() {
echo -e "\e[30;1m[$(current_time)] ${1}\e[0m"
}
function echo_blue() {
echo -e "\e[34;1m[$(current_time)] ${1}\e[0m"
}
function echo_pink() {
echo -e "\e[35;1m[$(current_time)] ${1}\e[0m"
}
function echo_purple() {
echo -e "\e[36;1m[$(current_time)] ${1}\e[0m"
}
function echo_white() {
echo -e "\e[37;1m[$(current_time)] ${1}\e[0m"
}
function error_exit() {
echo_error "${1}"
shell_unlock
exit 1
}
function executed() {
echo_succes "${1}已执行"
echo_print "如果确定要重新执行请删掉文件(${2}),重新执行本脚本"
}
function execute_start() {
grep "${1}执行完成" ${2} &> /dev/null
if [[ $? -eq 0 ]] ; then
executed ${1} ${2}
return 0
else
return 255
fi
}
function execute_end() {
echo "${1}执行完成" >> ${2}
}
function clear_execute() {
[[ -s ${1} ]] && mv ${1} ${1}_$(date +"%Y%m%d_%H%M%S")
find logs/ -type f -mtime +2 | xargs rm -f
}
function install_info_collection() {
echo_print '以下信息按 确认键 使用默认值'
[[ -s ${execute_log} ]] && \
php_user=$(grep '^execute_php_user:' ${execute_log} | awk -F':' '{print $2}')
if [[ -z ${php_user} ]] ; then
echo -ne "\e[33;1m请输入PHP启动用户,默认为:( \e[37;1m${default_php_user} \e[33;1m): \e[0m"
read php_user
[[ -n ${php_user} ]] && echo "execute_php_user:${php_user}" >> ${execute_log}
else
echo_succes "PHP启动用户默认为:( \e[37;1m${php_user} \e[32;1m),如果需要更改,请删除 ${execute_log} 文件"
fi
[[ -s ${execute_log} ]] && \
php_group=$(grep '^execute_php_group:' ${execute_log} | awk -F':' '{print $2}')
if [[ -z ${php_group} ]] ; then
echo -ne "\e[33;1m请输入PHP启动用户组,默认为:( \e[37;1m${default_php_group} \e[33;1m): \e[0m"
read php_group
[[ -n ${php_group} ]] && echo "execute_php_group:${php_group}" >> ${execute_log}
else
echo_succes "PHP启动用户组默认为:( \e[37;1m${php_group} \e[32;1m),如果需要更改,请删除 ${execute_log} 文件"
fi
[[ -s ${execute_log} ]] && \
software_dir=$(grep '^execute_software_dir:' ${execute_log} | awk -F':' '{print $2}')
if [[ -z ${software_dir} ]] ; then
echo -ne "\e[33;1m请输入软件服务存放目录,默认为:( \e[37;1m${default_software_dir} \e[33;1m): \e[0m"
read software_dir
[[ -n ${software_dir} ]] && echo "execute_software_dir:${software_dir}" >> ${execute_log}
else
echo_succes "软件服务存放目录默认为:( \e[37;1m${software_dir} \e[32;1m),如果需要更改,请删除 ${execute_log} 文件"
fi
[[ -s ${execute_log} ]] && \
php_port=$(grep '^execute_php_port:' ${execute_log} | awk -F':' '{print $2}')
if [[ -z ${php_port} ]] ; then
echo -ne "\e[33;1m请输入PHP启动端口,默认为:( \e[37;1m${default_php_port} \e[33;1m): \e[0m"
read php_port
[[ -n ${php_port} ]] && echo "execute_php_port:${php_port}" >> ${execute_log}
else
echo_succes "PHP启动端口默认为:( \e[37;1m${php_port} \e[32;1m),如果需要更改,请删除 ${execute_log} 文件"
fi
[[ -s ${execute_log} ]] && \
php_init_dir=$(grep '^execute_php_init_dir:' ${execute_log} | awk -F':' '{print $2}')
if [[ -z ${php_init_dir} ]] ; then
echo -ne "\e[33;1m请输入PHP部署目录,默认为:( \e[37;1m${default_php_init_dir} \e[33;1m): \e[0m"
read php_init_dir
[[ -n ${php_init_dir} ]] && echo "execute_php_init_dir:${php_init_dir}" >> ${execute_log}
else
echo_succes "PHP部署目录默认为:( \e[37;1m${php_init_dir} \e[32;1m),如果需要更改,请删除 ${execute_log} 文件"
fi
[[ -s ${execute_log} ]] && \
librabbitmq_init_dir=$(grep '^execute_librabbitmq_init_dir:' ${execute_log} | awk -F':' '{print $2}')
if [[ -z ${librabbitmq_init_dir} ]] ; then
echo -ne "\e[33;1m请输入librabbitmq部署目录,默认为:( \e[37;1m${default_librabbitmq_init_dir} \e[33;1m): \e[0m"
read librabbitmq_init_dir
[[ -n ${librabbitmq_init_dir} ]] && echo "execute_librabbitmq_init_dir:${librabbitmq_init_dir}" >> ${execute_log}
else
echo_succes "librabbitmq部署目录默认为:( \e[37;1m${librabbitmq_init_dir} \e[32;1m),如果需要更改,请删除 ${execute_log} 文件"
fi
[[ -z ${php_user} ]] && php_user=${default_php_user}
[[ -z ${php_group} ]] && php_group=${default_php_group}
[[ -z ${software_dir} ]] && software_dir=${default_software_dir}
[[ -z ${php_port} ]] && php_port=${default_php_port}
[[ -z ${php_init_dir} ]] && php_init_dir=${default_php_init_dir}
[[ -z ${librabbitmq_init_dir} ]] && librabbitmq_init_dir=${default_librabbitmq_init_dir}
echo -e '\e[35;1m=======================================================================================\e[0m'
echo -e "\e[33;1mPHP启动用户为: \e[37;1m${php_user}\e[0m"
echo -e "\e[33;1mPHP启动用户组为: \e[37;1m${php_group}\e[0m"
echo -e "\e[33;1m软件服务存放目录为: \e[37;1m${software_dir}\e[0m"
echo -e "\e[33;1mPHP启动端口为: \e[37;1m${php_port}\e[0m"
echo -e "\e[33;1mPHP部署目录为: \e[37;1m${php_init_dir}\e[0m"
echo -e "\e[33;1mlibrabbitmq部署目录为: \e[37;1m${librabbitmq_init_dir}\e[0m"
echo -e '\e[35;1m=======================================================================================\e[0m'
echo -ne "\e[33;1m请再次确认安装信息,按确认键 继续操作: \e[0m"
read judge
}
function install_dependent_package() {
cd ${bash_dir}
execute_start "INSTALL_DEPENDENT_PACKAGE" ${execute_log} && return
yum -y install epel-release && yum clean all && yum makecache
[[ $? -ne 0 ]] && error_exit "安装epel源失败"
yum -y install libxml2-devel openssl-devel sqlite-devel libcurl-devel \
libicu-devel gcc gcc-c++ oniguruma-devel \
libxslt-devel libpng-devel libjpeg-devel freetype-devel \
bzip2-devel libzstd-devel c-ares-devel wget \
vim lrzsz bash-completion net-tools autoconf gmp-devel
[[ $? -ne 0 ]] && error_exit "安装依赖包失败"
echo_succes "安装依赖包完成"
execute_end "INSTALL_DEPENDENT_PACKAGE" ${execute_log}
}
function install_libzip() {
cd ${bash_dir}
export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig/"
execute_start "INSTALL_LIBZIP" ${execute_log} && return
[[ -d ${libzip_tar_dir} ]] && rm -rf ${libzip_tar_dir}
[[ -s ${libzip_tar_name} ]] || wget https://libzip.org/download/${libzip_tar_name} --no-check-certificate
tar zxf ${libzip_tar_name}
[[ $? -ne 0 ]] && error_exit "libzip压缩包解压失败"
cd ${libzip_tar_dir} && ./configure && make && make install
[[ $? -ne 0 ]] && error_exit "libzip安装失败"
echo_succes "libzip安装完成"
execute_end "INSTALL_LIBZIP" ${execute_log}
}
function install_php() {
cd ${bash_dir}
execute_start "INSTALL_PHP" ${execute_log} && return
if [[ -d ${php_init_dir} ]] ; then
php_init_dir_size=$(du -s ${php_init_dir} | awk '{print $1}')
[[ ${php_init_dir_size} -gt 0 ]] && \
error_exit "PHP部署目录 (${php_init_dir}) 已存在着数据,确定要安装,请清理目录后再执行脚本"
fi
[[ -d ${php_tar_dir} ]] && rm -rf ${php_tar_dir}
[[ -s ${php_tar_name} ]] || wget https://www.php.net/distributions/${php_tar_name}
tar zxf ${php_tar_name}
[[ $? -ne 0 ]] && error_exit "PHP压缩包解压失败"
cd ${php_tar_dir}
[[ $? -ne 0 ]] && error_exit "进入PHP安装包目录失败"
${compile_info}
[[ $? -ne 0 ]] && error_exit "PHP编译失败"
#sed -i '/^EXTRA_LIBS/s/$/ -llber/' Makefile && \
# sed -i '/^EXTRA_LIBS/s/$/ -liconv/' Makefile
make -j 2
[[ $? -ne 0 ]] && error_exit "PHP_make失败"
make install
[[ $? -ne 0 ]] && error_exit "PHP_make_install失败"
echo_succes "PHP部署完成"
execute_end "INSTALL_PHP" ${execute_log}
}
function to_configure() {
execute_start "TO_CONFIGURE" ${execute_log} && return
cat > ${php_init_dir}/etc/php-fpm.conf <<EOF
[global]
process.max = 0
rlimit_files = 65535
events.mechanism = epoll
pid = ${php_init_dir}/var/run/php-fpm.pid
error_log = ${php_init_dir}/var/log/php-fpm.log
log_level = notice
[www]
user = ${php_user}
group = ${php_group}
listen = 127.0.0.1:${php_port}
listen.backlog = -1
listen.owner = ${php_user}
listen.group = ${php_group}
listen.mode = 0666
pm = dynamic
pm.max_children = 256
pm.start_servers = 16
pm.min_spare_servers = 8
pm.max_spare_servers = 32
pm.max_requests = 1000
pm.status_path = /phpfpm74_status
slowlog = ${php_init_dir}/var/log/\$pool.log.slow
request_slowlog_timeout = 5
request_terminate_timeout = 30
security.limit_extensions=.php .php3 .php4 .php5 .html .js .css .jpg .jpeg .gif .png .htm
EOF
[[ $? -ne 0 ]] && error_exit "php-fpm.conf配置文件修改失败"
cat > ${php_init_dir}/etc/php.ini <<EOF
[PHP]
engine = On
short_open_tag = On
asp_tags = Off
precision = 14
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = 17
disable_functions =
disable_classes =
zend.enable_gc = On
expose_php = Off
max_execution_time = 30
max_input_time = 60
max_input_vars = 4096
memory_limit = 128M
error_reporting = E_WARING & ERROR
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
html_errors = On
variables_order = "GPCS"
request_order = "GP"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 8M
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
upload_max_filesize = 2M
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
zend_extension=opcache.so
extension=memcache.so
extension=protobuf.so
extension=swoole.so
extension=amqp.so
extension=msgpack.so
extension=hprose.so
extension=igbinary.so
extension=redis.so
cgi.fix_pathinfo=1
[CLI Server]
cli_server.color = On
[Date]
date.timezone = Asia/Shanghai
[filter]
[iconv]
[intl]
[sqlite]
[sqlite3]
[Pcre]
[Pdo]
[Pdo_mysql]
pdo_mysql.cache_size = 2000
pdo_mysql.default_socket=/tmp/mysql.sock
[Phar]
phar.readonly = On
[mail function]
SMTP = localhost
smtp_port = 25
mail.add_x_header = On
[SQL]
sql.safe_mode = Off
[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1
[Interbase]
ibase.allow_persistent = 1
ibase.max_persistent = -1
ibase.max_links = -1
ibase.timestampformat = "%Y-%m-%d %H:%M:%S"
ibase.dateformat = "%Y-%m-%d"
ibase.timeformat = "%H:%M:%S"
[MySQL]
mysql.allow_local_infile = On
mysql.allow_persistent = On
mysql.cache_size = 2000
mysql.max_persistent = -1
mysql.max_links = -1
mysql.default_port =
mysql.default_socket =/tmp/mysql.sock
mysql.default_host =
mysql.default_user =
mysql.default_password =
mysql.connect_timeout = 60
mysql.trace_mode = Off
[MySQLi]
mysqli.max_persistent = -1
mysqli.allow_persistent = On
mysqli.max_links = -1
mysqli.cache_size = 2000
mysqli.default_port = 3306
mysqli.default_socket =/tmp/mysql.sock
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off
[mysqlnd]
mysqlnd.collect_statistics = On
mysqlnd.collect_memory_statistics = Off
[OCI8]
[PostgreSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
[Sybase-CT]
sybct.allow_persistent = On
sybct.max_persistent = -1
sybct.max_links = -1
sybct.min_server_severity = 10
sybct.min_client_severity = 10
[bcmath]
bcmath.scale = 0
[browscap]
session.save_handler = files
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
[MSSQL]
mssql.allow_persistent = On
mssql.max_persistent = -1
mssql.max_links = -1
mssql.min_error_severity = 10
mssql.min_message_severity = 10
mssql.compatibility_mode = Off
mssql.secure_connection = Off
[Assertion]
[COM]
[mbstring]
[gd]
[exif]
[Tidy]
tidy.clean_output = Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
soap.wsdl_cache_limit = 5
[sysvshm]
[ldap]
ldap.max_links = -1
[mcrypt]
[dba]
[opcache]
opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=2000
opcache.revalidate_freq=30
opcache.fast_shutdown=1
swoole.use_shortname = 'Off'
EOF
[[ $? -ne 0 ]] && error_exit "php.ini配置文件修改失败"
echo_succes "PHP配置文件修改完成"
execute_end "TO_CONFIGURE" ${execute_log} && return
}
function install_igbinary() {
cd ${bash_dir}
execute_start "INSTALL_IGBINARY" ${execute_log} && return
[[ -d ${igbinary_tar_dir} ]] && rm -rf ${igbinary_tar_dir}
[[ -s ${igbinary_tar_name} ]] || wget https://pecl.php.net/get/${igbinary_tar_name}
tar zxf ${igbinary_tar_name}
[[ $? -ne 0 ]] && error_exit "igbinary压缩包解压失败"
cd ${igbinary_tar_dir} && ${php_init_dir}/bin/phpize && \
./configure --with-php-config=${php_init_dir}/bin/php-config && \
make && make install
[[ $? -ne 0 ]] && error_exit "igbinary安装失败"
echo_succes "igbinary安装完成"
execute_end "INSTALL_IGBINARY" ${execute_log}
}
function install_protobuf() {
cd ${bash_dir}
execute_start "INSTALL_PROTOBUF" ${execute_log} && return
[[ -d ${protobuf_tar_dir} ]] && rm -rf ${protobuf_tar_dir}
[[ -s ${protobuf_tar_name} ]] || wget https://pecl.php.net/get/${protobuf_tar_name}
tar zxf ${protobuf_tar_name}
[[ $? -ne 0 ]] && error_exit "protobuf压缩包解压失败"
cd ${protobuf_tar_dir} && ${php_init_dir}/bin/phpize && \
./configure --with-php-config=${php_init_dir}/bin/php-config && \
make && make install
[[ $? -ne 0 ]] && error_exit "protobuf安装失败"
echo_succes "protobuf安装完成"
execute_end "INSTALL_PROTOBUF" ${execute_log}
}
function install_memcache() {
cd ${bash_dir}
execute_start "INSTALL_MEMCACHE" ${execute_log} && return
[[ -d ${memcache_tar_dir} ]] && rm -rf ${memcache_tar_dir}
[[ -s ${memcache_tar_name} ]] || wget https://pecl.php.net/get/${memcache_tar_name}
tar zxf ${memcache_tar_name}
[[ $? -ne 0 ]] && error_exit "memcache压缩包解压失败"
cd ${memcache_tar_dir} && ${php_init_dir}/bin/phpize && \
./configure --with-php-config=${php_init_dir}/bin/php-config && \
make && make install
[[ $? -ne 0 ]] && error_exit "memcache安装失败"
echo_succes "memcache安装完成"
execute_end "INSTALL_MEMCACHE" ${execute_log}
}
function install_msgpack() {
cd ${bash_dir}
execute_start "INSTALL_MSGPACK" ${execute_log} && return
[[ -d ${msgpack_tar_dir} ]] && rm -rf ${msgpack_tar_dir}
[[ -s ${msgpack_tar_name} ]] || wget https://pecl.php.net/get/${msgpack_tar_name}
tar zxf ${msgpack_tar_name}
[[ $? -ne 0 ]] && error_exit "msgpack压缩包解压失败"
cd ${msgpack_tar_dir} && ${php_init_dir}/bin/phpize && \
./configure --with-php-config=${php_init_dir}/bin/php-config && \
make && make install
[[ $? -ne 0 ]] && error_exit "msgpack安装失败"
echo_succes "msgpack安装完成"
execute_end "INSTALL_MSGPACK" ${execute_log}
}
function install_hprose() {
cd ${bash_dir}
execute_start "INSTALL_HPROSE" ${execute_log} && return
[[ -d ${hprose_tar_dir} ]] && rm -rf ${hprose_tar_dir}
[[ -s ${hprose_tar_name} ]] || wget https://pecl.php.net/get/${hprose_tar_name}
tar zxf ${hprose_tar_name}
[[ $? -ne 0 ]] && error_exit "hprose压缩包解压失败"
cd ${hprose_tar_dir} && ${php_init_dir}/bin/phpize && \
./configure --with-php-config=${php_init_dir}/bin/php-config && \
make && make install
[[ $? -ne 0 ]] && error_exit "hprose安装失败"
echo_succes "hprose安装完成"
execute_end "INSTALL_HPROSE" ${execute_log}
}
function install_swoole() {
cd ${bash_dir}
execute_start "INSTALL_SWOOLE" ${execute_log} && return
[[ -d ${swoole_tar_dir} ]] && rm -rf ${swoole_tar_dir}
[[ -s ${swoole_tar_name} ]] || wget https://pecl.php.net/get/${swoole_tar_name}
tar zxf ${swoole_tar_name}
[[ $? -ne 0 ]] && error_exit "swoole压缩包解压失败"
cd ${swoole_tar_dir} && ${php_init_dir}/bin/phpize && \
./configure --with-php-config=${php_init_dir}/bin/php-config \
--enable-openssl && \
make && make install
[[ $? -ne 0 ]] && error_exit "swoole安装失败"
echo_succes "swoole安装完成"
execute_end "INSTALL_SWOOLE" ${execute_log}
}
function install_redis() {
cd ${bash_dir}
execute_start "INSTALL_REDIS" ${execute_log} && return
[[ -d ${redis_tar_dir} ]] && rm -rf ${redis_tar_dir}
[[ -s ${redis_tar_name} ]] || wget https://pecl.php.net/get/${redis_tar_name}
tar zxf ${redis_tar_name}
[[ $? -ne 0 ]] && error_exit "redis压缩包解压失败"
cd ${redis_tar_dir} && ${php_init_dir}/bin/phpize && \
./configure --with-php-config=${php_init_dir}/bin/php-config \
--enable-redis-msgpack && \
make && make install
[[ $? -ne 0 ]] && error_exit "redis安装失败"
echo_succes "redis安装完成"
execute_end "INSTALL_REDIS" ${execute_log}
}
function install_librabbitmq() {
cd ${bash_dir}
execute_start "INSTALL_LIBRABBITMQ" ${execute_log} && return
if [[ -d ${software_dir}/${librabbitmq_tar_dir} ]] ; then
echo -ne "\e[33;1mlibrabbitmq部署的软件服务目录已存在,是否删除重新部署( yes|no ) \e[0m"
read judge
if [[ "${judge}" == "yes" ]] ; then
[[ -z ${software_dir} || -z ${librabbitmq_tar_dir} ]] && \
echo "software_dir:${software_dir} librabbitmq_tar_dir:${librabbitmq_tar_dir}" && \
error_exit "software_dir 或者 librabbitmq_tar_dir 变量为空,不用作删除目录处理"
rm -rf ${software_dir}/${librabbitmq_tar_dir}
else
execute_end "INSTALL_LIBRABBITMQ" ${execute_log} && return
fi
fi
[[ -s ${librabbitmq_tar_name} ]] || \
wget https://github.com/alanxz/rabbitmq-c/releases/download/v${librabbitmq_version}/${librabbitmq_tar_name}
tar zxf ${librabbitmq_tar_name} -C ${software_dir}
[[ $? -ne 0 ]] && error_exit "librabbitmq压缩包解压失败"
cd ${software_dir}/${librabbitmq_tar_dir} && \
./configure --prefix=${software_dir}/${librabbitmq_tar_dir} && \
make && make install
[[ $? -ne 0 ]] && error_exit "librabbitmq安装失败"
echo_succes "librabbitmq安装完成"
execute_end "INSTALL_LIBRABBITMQ" ${execute_log}
}
function install_amqp() {
cd ${bash_dir}
execute_start "INSTALL_AMQP" ${execute_log} && return
[[ -d ${amqp_tar_dir} ]] && rm -rf ${amqp_tar_dir}
[[ -s ${amqp_tar_name} ]] || wget https://pecl.php.net/get/${amqp_tar_name}
tar zxf ${amqp_tar_name}
[[ $? -ne 0 ]] && error_exit "amqp压缩包解压失败"
cd ${amqp_tar_dir} && ${php_init_dir}/bin/phpize && \
./configure --with-php-config=${php_init_dir}/bin/php-config \
--with-amqp --with-librabbitmq-dir=${software_dir}/${librabbitmq_tar_dir} && \
make && make install
[[ $? -ne 0 ]] && error_exit "amqp安装失败"
echo_succes "amqp安装完成"
execute_end "INSTALL_AMQP" ${execute_log}
}
function start_php_fpm () {
cd ${bash_dir}
execute_start "INSTALL_START_PHP_FPM" ${execute_log} && return
id ${php_user}
[[ $? -ne 0 ]] && groupadd ${php_group} && useradd ${php_user} -r -s /sbin/nologin -g ${php_group}
chown -R ${php_user}:${php_group} ${php_init_dir}/var
cd ${php_tar_dir}
[[ -s /etc/init.d/php-fpm74 ]] && mv /etc/init.d/php-fpm74 /etc/init.d/php-fpm74-$(date +"%Y%m%d-%H%M%S")
\cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm74 && \
chmod 755 /etc/init.d/php-fpm74 && \
chkconfig --add php-fpm74 && \
chkconfig --level 345 php-fpm74 on
[[ $? -ne 0 ]] && error_exit "设置php-fpm开机自启动失败"
service php-fpm74 start
[[ $? -ne 0 ]] && error_exit "php-fpm启动失败"
echo_succes "php-fpm启动成功"
execute_end "INSTALL_START_PHP_FPM" ${execute_log} && return
}
shell_lock
install_info_collection
php_install_compile_info
install_dependent_package
install_libzip
install_php
to_configure
install_igbinary
install_protobuf
install_memcache
install_msgpack
install_hprose
install_swoole
install_redis
install_librabbitmq
install_amqp
start_php_fpm
shell_unlock
2、PHP网站配置样例
在Nginx的conf文件夹中创建文件fscgi.conf,用于编辑FastCGI的全局配置,配置内容如下:
# 缓冲区配置
fastcgi_buffering on; # 默认启用缓冲区
fastcgi_buffers 8 64k; # 若响应数据大小小于512KB,则会分配8个64KB缓冲区为其缓
# 冲;若大于512KB,则超出的部分会存储到临时文件中
fastcgi_buffer_size 64k; # 读取FastCGI服务器响应数据第一部分的缓冲区大小为64KB,
# 通常包含响应头信息
fastcgi_busy_buffers_size 128K; # 繁忙时向客户端发送响应的缓冲区大小为128KB
fastcgi_limit_rate 0; # 默认不做限制
fastcgi_max_temp_file_size 1024M; # 临时文件中大小为1024MB
fastcgi_temp_file_write_size 64k; # 每次写入临时文件的数据大小为64KB
# fastcgi_temp_path使用默认配置
# 请求处理
fastcgi_request_buffering on; # 默认启用读取整个请求体到缓冲区后再向FastCGI服务器发送请求
fastcgi_pass_request_body on; # 默认将客户端请求体传递给FastCGI服务器
fastcgi_pass_request_headers on; # 默认将客户端请求头传递给FastCGI服务器
# FastCGI连接配置
fastcgi_connect_timeout 60s; # 默认Nginx与FastCGI服务器建立连接的超时时间为60s
fastcgi_keep_conn on; # 启用保持连接
fastcgi_ignore_client_abort on; # 当客户端关闭连接时,同时关闭与FastCGI服务器的连接
fastcgi_read_timeout 60s; # 默认连续两个从FastCGI服务器接收数据的读操作之间的间隔时间为60s
fastcgi_send_timeout 60s; # 默认连续两个发送到FastCGI服务器的写操作之间的间隔时间为60s
fastcgi_socket_keepalive on; # FastCGI的连接启用so-keepalive socket选项
# 响应处理
fastcgi_force_ranges on ; # 强制启用byte-range请求支持
fastcgi_hide_header X-Powered-By; # 隐藏PHP版本字段
# fastcgi_pass_header无必须传递的特殊头字段属性
fastcgi_ignore_headers X-Accel-Redirect X-Accel-Expires \
X-Accel-Limit-Rate X-Accel-Buffering \
X-Accel-Charset Expires \
Cache-Control Set-Cookie Vary;
# 禁止Nginx处理从FastCGI获取响应的头属性字段
# 异常处理
fastcgi_intercept_errors on; # 在FastCGI响应数据中响应码大于等于300时重定向给Nginx
fastcgi_next_upstream error timeout invalid_header \
http_500 http_503 http_403 \
http_404 http_429; # 当出现指定的条件时,将用户请求传递给upstream中的下一个服务器
fastcgi_next_upstream_timeout 0; # 不限制将用户请求传递给upstream中的下一个服务器的超时时间
fastcgi_next_upstream_tries 0; # 不限制将用户请求传递给upstream中的下一个服务器的尝试次数
3、Nginx PHP网站配置如下:
server {
listen 8080;
root /opt/nginx-web/phpweb;
index index.php; # 默认首页index.php
include fscgi.conf; # 引入FastCGI配置
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000; # FastCGI服务器地址及端口
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$; # 获取$fastcgi_path_info变量值
fastcgi_param PATH_INFO $fastcgi_path_info; # 赋值给参数PATH_INFO
include fastcgi.conf; # 引入默认参数文件
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
}
4、FastCGI集群负载及缓存
安装PHP-FPM后,如果把PHP代码部署在与Nginx不同的服务器上,需要修改PHP-FPM服务器中的/etc/php-fpm.d/www.conf配置。
# PHP-FPM绑定本机所有IP
sed -i "s/^listen =.*/listen = 0.0.0.0:9000/g" /etc/php-fpm.d/www.conf
# 允许任何主机访问PHP-FPM服务
sed -i "s/^listen.allowed_clients/;listen.allowed_clients/g" /etc/php-fpm.d/www.conf
Nginx配置样例如下:
upstream fscgi_server {
ip_hash; # session会话保持
server 192.168.2.145:9000; # PHP-FPM服务器IP
server 192.168.2.159:9000; # PHP-FPM服务器IP
}
fastcgi_cache_path /usr/local/nginx/nginx-cache1
levels=1:2
keys_zone=fscgi_hdd1:100m
max_size=10g
use_temp_path=off
inactive=60m; # 设置缓存存储路径1,缓存的共享内存名称和大小100MB,无效缓存的判断时间为1小时
fastcgi_cache_path /usr/local/nginx/nginx-cache2
levels=1:2
keys_zone=fscgi_hdd2:100m
max_size=10g
use_temp_path=off
inactive=60m; # 设置缓存存储路径2,缓存的共享内存名称和大小100MB,无效缓存的判断时间为1小时
split_clients $request_uri $fscgi_cache {
50% "fscgi_hdd1"; # 50%请求的缓存存储在第一个磁盘上
50% "fscgi_hdd2"; # 50%请求的缓存存储在第二个磁盘上
}
server {
listen 8080;
root /opt/nginx-web/phpweb;
index index.php;
include fscgi.conf; # 引入默认配置文件
location ~ \.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) { # 静态资源文件过期时间为12小时
expires 12h;
}
set $no_cache 0;
if ($query_string != "") { # URI无参数的数据不进行缓存
set $no_cache 1;
}
location ~ \.php(.*)$ {
root /opt/nginx-web/phpweb;
fastcgi_cache $fscgi_cache; # 启用fastcgi_cache_path设置的$fscgi_cache的共享内存区域做缓存
fastcgi_cache_key ${request_method}://$host$request_uri; # 设置缓存的关键字
fastcgi_cache_lock on; # 启用缓存锁
fastcgi_cache_lock_age 5s; # 启用缓存锁时,添加缓存请求的处理时间为5s
fastcgi_cache_lock_timeout 5s; # 等待缓存锁超时时间为5s
fastcgi_cache_methods GET HEAD; # 默认对GET及HEAD方法的请求进行缓存
fastcgi_cache_min_uses 1; # 响应数据被请求一次就将被缓存
fastcgi_no_cache $no_cache; # $no_cache时对当前请求不进行缓存
fastcgi_cache_bypass $no_cache; # $no_cache时对当前请求不进行缓存
fastcgi_cache_use_stale error timeout invalid_header
updating http_500 http_503
http_403 http_404 http_429; # 当出现指定的条件时,使用已经过期的缓存响应数据
fastcgi_cache_background_update on; # 允许使用过期的响应数据时,启用后台子请求用于更新过期缓存,并将过期的缓存响应数据返回给客户端
fastcgi_cache_revalidate on; # 当缓存过期时,向后端服务器发起包含If-Modified-Since和If-None-Match HTTP消息头字段的服务端校验
fastcgi_cache_valid 200 301 302 10h; # 200 301 302状态码的响应缓存10小时
fastcgi_cache_valid any 1m; # 其他状态码的响应缓存1分钟
add_header X-Cache-Status $upstream_cache_status; # 查看缓存命中状态
fastcgi_pass fscgi_server;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$; # 获取$fastcgi_path_info变量值
fastcgi_param PATH_INFO $fastcgi_path_info; # 赋值给参数PATH_INFO
include fastcgi.conf; # 引入默认参数文件
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
}
评论区