CentOS 7 编译安装 Nginx + PHP + MySQL
Debian / Ubuntu 编译安装 Nginx + PHP + MySQL
Nginx版本:1.17.3
PHP版本:7.2.21 + OPCache
MySQL版本:5.6.45
CentOS更新系统软件包到最新
yum updateDebian/Ubuntu更新系统软件包到最新
apt-get update
apt-get -y upgrade
下载软件包到/tmp/lnmp目录
mkdir -p /tmp/lnmp
cd /tmp/lnmpwget http://mirrors.sohu.com/nginx/nginx-1.17.3.tar.gz
wget http://mirrors.sohu.com/php/php-7.2.21.tar.gz
wget http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.45.tar.gz
wget https://files1.ich8.com/upfiles/2019/openssl-1.1.1c.tar.gz
wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
wget https://www.zlib.net/zlib-1.2.11.tar.gz
#PHP探针
wget https://files1.ich8.com/upfiles/2019/tz.zipCentOS 安装必要的软件包
yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel mhash gd gd-devel autoconf cmake bison lrzsz gcc-c++ ncurses-devel automake libevent libevent-devel gd gd-devel libtool* libmcrypt libmcrypt-devel mcrypt mhash libxslt libxslt-devel readline readline-devel gmp gmp-devel libcurl libcurl-devel openjpeg-devel automake boost-devel glib2-devel gmp-devel jemalloc-devel libevent libevent-devel libicu-devel libidn-devel libtool libtool-ltdl libtool-ltdl-devel libxslt libxslt-devel mcrypt nss-pam-ldapd openjpeg-devel openldap-devel readline-devel
Debian/Ubuntu 安装必要的软件包
apt-get install -y autoconf cmake openssl libwrap0-dev libncurses5-dev libssl-dev libxml2-dev libcurl4-openssl-dev pkg-config libbz2-dev libjpeg-dev libxpm-dev libfreetype6-dev libmcrypt-dev libxslt1-dev libiconv-hook-dev libpcre3 libpcre3-dev gcc bison g++ lrzsz libperl-dev
apt-get install -y sysv-rc-conf  # 启动项管理
编译MySQL
# 进入lnmp目录
cd /tmp/lnmp
# 创建MySQL用户组和用户,不创建用户家目录,允许bash登陆
groupadd mysql
useradd -s /sbin/nologin -M -g mysql mysql
# 创建MySQL目录和数据库目录
mkdir -p /usr/local/mysql
mkdir -p /usr/local/mysql/data
# 赋予所有文件和子目录对应MySQL用户和组权限
chown -R mysql:mysql /usr/local/mysql解压MySQL压缩包文件并编译安装
tar zxvf mysql-5.6.45.tar.gz
cd mysql-5.6.45
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLED_LOCAL_INFILE=1 
make
make install创建MySQL配置文件,位于etc目录下
cat > /etc/my.cnf<<EOF
[client]
#password	= your_password
port		= 3306
socket		= /tmp/mysql.sock
[mysqld]
port		= 3306
socket		= /tmp/mysql.sock
datadir = /usr/local/mysql/data
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
thread_cache_size = 8
query_cache_size = 8M
tmp_table_size = 16M
#skip-networking
max_connections = 500
max_connect_errors = 100
open_files_limit = 65535
log-bin=mysql-bin
binlog_format=mixed
server-id	= 1
expire_logs_days = 10
default_storage_engine = InnoDB
innodb_data_home_dir = /usr/local/mysql/data
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /usr/local/mysql/data
innodb_buffer_pool_size = 16M
innodb_additional_mem_pool_size = 2M
innodb_log_file_size = 5M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
EOF初始化MySQL数据库
cd /usr/local/mysql/
./scripts/mysql_install_db --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysqlCentOS 创建启动脚本并设置开机自动启动
cp ./support-files/mysql.server /etc/init.d/mysql
chmod 755 /etc/init.d/mysql
chkconfig --add mysqlDebian/Ubuntu创建启动脚本并设置开机自动启动
cp ./support-files/mysql.server /etc/init.d/mysql
chmod 755 /etc/init.d/mysql
sysv-rc-conf mysql on
systemctl enable mysql.service启动MySQL
service mysql start修改默认root密码(默认为空)为123456
/usr/local/mysql/bin/mysqladmin -u root password '123456'
创建动态链接库文件
cat > /etc/ld.so.conf.d/mysql.conf<<EOF
    /usr/local/mysql/lib
    /usr/local/lib
EOF
ldconfig
ln -sf /usr/local/mysql/lib/mysql /usr/lib/mysql
ln -sf /usr/local/mysql/include/mysql /usr/include/mysql
编译PHP,创建www用户组和用户
groupadd www
useradd -s /sbin/nologin -g www www
解压php安装包并编译安装,需要搭配安装或开启的组件自行增删
cd /tmp/lnmp
tar zxvf php-7.2.21.tar.gz
cd php-7.2.21
./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-config-file-scan-dir=/usr/local/php/conf.d \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-mysqlnd-compression-support \
--with-iconv-dir \
--with-freetype-dir=/usr/local/freetype \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--with-curl \
--with-libmbfl \
--with-openssl \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-mbstring \
--enable-intl \
--enable-pcntl \
--enable-ftp \
--with-gd \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--with-gettext \
--enable-opcache \
--with-xsl
make
make install
创建php/etc和php/conf.d目录
mkdir -p /usr/local/php/etc
mkdir -p /usr/local/php/conf.d复制php生产环境配置文件到php/etc目录并重命名为php.ini
cp php.ini-production /usr/local/php/etc/php.ini
修改php.ini配置文件,可自行vi手动修改
post_max_size POST最大大小
upload_max_filesize 上传文件最大大小
date.timezone 时区
short_open_tag 是否允许代码标志的缩写标志
cgi.fix_pathinfo CGI完整路径
max_execution_time PHP超时设置
disable_functions 禁用函数
expose_php 不显示php版本信息
memory_limit 运行内存大小设置
sed -i 's/post_max_size =.*/post_max_size = 64M/g' /usr/local/php/etc/php.ini
sed -i 's/upload_max_filesize =.*/upload_max_filesize = 64M/g' /usr/local/php/etc/php.ini
sed -i 's/;date.timezone =.*/date.timezone = PRC/g' /usr/local/php/etc/php.ini
sed -i 's/short_open_tag =.*/short_open_tag = On/g' /usr/local/php/etc/php.ini
sed -i 's/;cgi.fix_pathinfo=.*/cgi.fix_pathinfo=1/g' /usr/local/php/etc/php.ini
sed -i 's/max_execution_time =.*/max_execution_time = 60/g' /usr/local/php/etc/php.ini
sed -i 's/disable_functions =.*/disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server/g' /usr/local/php/etc/php.ini
sed -i 's/expose_php =.*/expose_php = Off/g' /usr/local/php/etc/php.ini
sed -i 's/memory_limit =.*/memory_limit = 256M/g' /usr/local/php/etc/php.ini
开启OPCache支持,提高php运行效率,在php.ini文件末尾
参数详解:https://www.php.net/manual/zh/opcache.configuration.php
cat >> /usr/local/php/etc/php.ini<<EOF
[opcache]
zend_extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=192
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=5000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
EOF创建php-fpm.conf文件
vi /usr/local/php/etc/php-fpm.conf参数详解:https://www.php.net/manual/zh/install.fpm.configuration.php
[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice
[www]
listen = /tmp/php-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 6
pm.max_requests = 1024
pm.process_idle_timeout = 10s
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = var/log/slow.logCentOS 创建php-fpm.service文件
vi /usr/lib/systemd/system/php-fpm.serviceUbuntu 创建php-fpm.service文件
mkdir -p /usr/lib/systemd/system
vi /usr/lib/systemd/system/php-fpm.servicephp-fpm.service文件内容
[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target
[Service]
Type=simple
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
创建软链接
ln -sf /usr/local/php/bin/php /usr/bin/php
ln -sf /usr/local/php/bin/phpize /usr/bin/phpize
ln -sf /usr/local/php/bin/pear /usr/bin/pear
ln -sf /usr/local/php/bin/pecl /usr/bin/pecl
ln -sf /usr/local/php/sbin/php-fpm /usr/bin/php-fpm
使能并自动启动php-fpm服务
systemctl enable php-fpm.service重启php-fpm服务
systemctl restart php-fpm.service
解压Nginx安装文件以及自定义OpenSSL、PCRE、Zlib库源码包
cd /tmp/lnmp
tar zxvf  nginx-1.17.3.tar.gz
tar zxvf  openssl-1.1.1c.tar.gz
tar zxvf  pcre-8.43.tar.gz
tar zxvf  zlib-1.2.11.tar.gzCentOS 安装perl模块,这里启用了Nginx的http_perl_module支持
yum -y install perl-devel perl-ExtUtils-Embed编译并安装Nginx
cd nginx-1.17.3
./configure \
--user=www \
--group=www \
--prefix=/usr/local/nginx \
--with-openssl=../openssl-1.1.1c \
--with-pcre=../pcre-8.43 \
--with-pcre-jit \
--with-zlib=../zlib-1.2.11 \
--with-compat \
--with-file-aio \
--with-threads \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-ipv6 \
--with-http_sub_module \
--with-http_v2_module \
--with-http_perl_module \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
make
make install建立软链接
ln -sf /usr/local/nginx/sbin/nginx /usr/bin/nginx添加Nginx为系统服务,建立/etc/init.d/nginx文件
vi /etc/init.d/nginxCentOS 适用的 /etc/init.d/nginx 文件内容
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  NGINX is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /usr/local/nginx/conf/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /usr/local/nginx/logs/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
   # make required directories
   user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   if [ -z "`grep $user /etc/passwd`" ]; then
       useradd -M -s /bin/nologin $user
   fi
   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
   for opt in $options; do
       if [ `echo $opt | grep '.*-temp-path'` ]; then
           value=`echo $opt | cut -d "=" -f 2`
           if [ ! -d "$value" ]; then
               # echo "creating" $value
               mkdir -p $value && chown -R $user $value
           fi
       fi
   done
}
start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}
stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}
restart() {
    configtest || return $?
    stop
    sleep 1
    start
}
reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}
force_reload() {
    restart
}
configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
    status $prog
}
rh_status_q() {
    rh_status >/dev/null 2>&1
}
case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac
Debian/Ubuntu 适用的 /etc/init.d/nginx 文件内容
#! /bin/sh
# chkconfig: 2345 55 25
# Description: Startup script for nginx webserver on Debian. Place in /etc/init.d and
# run 'update-rc.d -f nginx defaults', or use the appropriate command on your
# distro. For CentOS/Redhat run: 'chkconfig --add nginx'
### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO
# Author:   licess
# website:  http://lnmp.org
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=nginx
NGINX_BIN=/usr/local/nginx/sbin/nginx
CONFIGFILE=/usr/local/nginx/conf/nginx.conf
PIDFILE=/usr/local/nginx/logs/nginx.pid
case "$1" in
start)
    echo -n "Starting $NAME... "
    if netstat -tnpl | grep -q nginx;then
        echo "$NAME (pid `pidof $NAME`) already running."
        exit 1
    fi
    $NGINX_BIN -c $CONFIGFILE
    if [ "$?" != 0 ] ; then
        echo " failed"
        exit 1
    else
        echo " done"
    fi
    ;;
stop)
    echo -n "Stoping $NAME... "
    if ! netstat -tnpl | grep -q nginx; then
        echo "$NAME is not running."
        exit 1
    fi
    $NGINX_BIN -s stop
    if [ "$?" != 0 ] ; then
        echo " failed. Use force-quit"
        exit 1
    else
        echo " done"
    fi
    ;;
status)
    if netstat -tnpl | grep -q nginx; then
        PID=`pidof nginx`
        echo "$NAME (pid $PID) is running..."
    else
        echo "$NAME is stopped"
        exit 0
    fi
    ;;
force-quit)
    echo -n "Terminating $NAME... "
    if ! netstat -tnpl | grep -q nginx; then
        echo "$NAME is not running."
        exit 1
    fi
    kill `pidof $NAME`
    if [ "$?" != 0 ] ; then
        echo " failed"
        exit 1
    else
        echo " done"
    fi
    ;;
restart)
    $0 stop
    sleep 1
    $0 start
    ;;
reload)
    echo -n "Reload service $NAME... "
    if netstat -tnpl | grep -q nginx; then
        $NGINX_BIN -s reload
        echo " done"
    else
        echo "$NAME is not running, can't reload."
        exit 1
    fi
    ;;
configtest)
    echo -n "Test $NAME configure files... "
    $NGINX_BIN -t
    ;;
*)
    echo "Usage: $0 {start|stop|force-quit|restart|reload|status|configtest}"
    exit 1
    ;;
esac赋予所有用户组执行Nginx权限
chmod a+x /etc/init.d/nginxCentOS 添加到开机启动并设置为开机自动启动
chkconfig --add /etc/init.d/nginx
chkconfig nginx onDebian/Ubuntu 添加到开机启动并设置为开机自动启动
sysv-rc-conf nginx onCentOS 启动Nginx服务
systemctl start nginxDebian/Ubuntu 启动Nginx服务
systemctl enable nginx.service
systemctl start nginx
创建网站目录,添加网站以及日志目录并赋予对应的权限,网站目录赋予www用户组权限
这里添加2个网站 一个默认localhost或者IP地址打开,另外一个则要用域名才能打开
mkdir -p /data/web/wwwroot
mkdir -p /data/web/default
chmod 777 /data/web/wwwroot
chmod 777 /data/web/default
chown -R www:www /data/web/wwwroot
chown -R www:www /data/web/default
mkdir -p /data/web/wwwlogs
chmod 777 /data/web/wwwlogs删除默认的Nginx配置文件,并在conf目录下创建vhost目录,用于存放网站的配置文件
rm -f /usr/local/nginx/conf/nginx.conf
mkdir -p /usr/local/nginx/conf/vhost创建FastCGI PHP的加载文件(把配置文件分割成不同小份,方便维护)
vi /usr/local/nginx/conf/enable_php.conf        location ~ [^/]\.php(/|$)
        {
            try_files $uri =404;
            fastcgi_pass  unix:/tmp/php-cgi.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
        }创建nginx.conf主配置文件
vi /usr/local/nginx/conf/nginx.confuser  www www;
worker_processes auto;
error_log  /data/web/wwwlogs/nginx_error.log  crit;
pid        /usr/local/nginx/logs/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 51200;
events
    {
        use epoll;
        worker_connections 51200;
        multi_accept on;
    }
http
    {
        include       mime.types;
        default_type  application/octet-stream;
        server_names_hash_bucket_size 128;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 50m;
        sendfile   on;
        tcp_nopush on;
        keepalive_timeout 60;
        tcp_nodelay on;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 256k;
        gzip on;
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
        gzip_vary on;
        gzip_proxied   expired no-cache no-store private auth;
        gzip_disable   "MSIE [1-6]\.";
        #limit_conn_zone $binary_remote_addr zone=perip:10m;
        ##If enable limit_conn_zone,add "limit_conn perip 10;" to server section.
        server_tokens off;
        access_log off;
server
    {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;
        server_name localhost;
        index index.html index.htm index.php;
        root  /data/web/default;
        #error_page   404   /404.html;
        include enable_php.conf;
        location /nginx_status
        {
            stub_status on;
            access_log   off;
        }
        location ~ .*\.(gif|jpg|jpeg|png|bmp|js|css)$
        {
            expires      7d;
        }
        location ~ /\.
        {
            deny all;
        }
        access_log off;
    }
include vhost/*.conf;
}创建网站的配置文件,网站存放目录为/data/web/wwwroot
vi /usr/local/nginx/conf/vhost/www.abc.com.conflisten使用80端口,server_name 绑定的域名 root 网站目录。其他参数可参考官方wiki
server
    {
        listen 80;
        #listen [::]:80;
        server_name www.abc.com;
        index index.html index.htm index.php;
        root  /data/web/wwwroot;
        #include none.conf;
        #error_page   404   /404.html;
        location ~ [^/]\.php(/|$)
        {
            # comment try_files $uri =404; to enable pathinfo
            try_files $uri =404;
            fastcgi_pass  unix:/tmp/php-cgi.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
        location ~ .*\.(gif|jpg|jpeg|png|bmp|js|css)$
        {
            expires      7d;
        }
        access_log off;
    }解压PHP探针到新建网站的目录
unzip /tmp/lnmp/tz.zip -d /data/web/wwwroot检查Nginx配置是否有出错,提示测试successful即可。
nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful重启php-fpm服务
systemctl restart php-fpm.service平滑变更Nginx设置
nginx -s reload其他
 
   
  
[分享]CentOS 7 /Debian / Ubuntu 编译安装 Nginx + PHP + MySQL:等您坐沙发呢!