注意:执行下列所有操作均需获得 root 权限,方法一,除了 cd 命令,其他命令均使用 sudo cmd 方式执行,或者 sudo passwd root 为 root 用户设置密码,然后 su 输入密码获得权限。
软件版本:
ubuntu-14-server
nginx-1.14.1
mariadb-10.2.19
php-7.2.12
首先要安装基本的软件包如编译器之类的:
apt-get update && apt-get install -y make gcc g++
还要安装 cmake (最新版,系统自带的太旧),后面编译 mysql 和一些小工具要用
wget https://cmake.org/files/v3.12/cmake-3.12.4.tar.gz
tar -xvzf cmake-3.12.4.tar.gz
cd cmake-3.12.4
./configure
make && make install
cd ../
然后定义所有服务器软件的安装目录
mkdir /usr/local/server
我们先安装 nginx (1.14.1)
正式安装前先需要下载一些编译 nginx 配置 依赖的库的源码,并且解压好但并不需要进入目录。
wget https://nginx.org/download/nginx-1.14.1.tar.gz
wget https://www.openssl.org/source/openssl-1.1.1.tar.gz
wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz
wget https://www.zlib.net/zlib-1.2.11.tar.gz
tar -xvzf openssl-1.1.1.tar.gz
tar -xvzf pcre-8.42.tar.gz
tar -xvzf zlib-1.2.11.tar.gz
首先我们创建 nginx 运行用户 www
useradd -M -s /sbin/nologin www
然后创建 nginx 安装目录
mkdir /usr/local/server/nginx
此处开始 编译安装 nginx
tar -xvzf nginx-1.14.1.tar.gz
cd nginx-1.14.1
./configure \
--prefix=/usr/local/server/nginx \
--user=www \
--group=www \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_mp4_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-pcre=../pcre-8.42 \
--with-zlib=../zlib-1.2.11 \
--with-openssl=../openssl-1.1.1
上述 ./configure 这些配置包含了支持 https协议、http2协议、mp4和flv伪流处理等等一些功能。
然后编译安装
make && make install
不出意外的话,20分钟内就可以编译完成了,为啥这么慢,因为他顺便编译了openssl、pcre、zlib的源码。
然后 运行 下面的命令 执行 nginx 的二进制文件,nginx就启动了。
/usr/local/server/nginx/sbin/nginx
然后退出当前 nginx 源码目录
cd ../
此时,访问你安装环境的主机或者虚拟机的IP地址就可以看到nginx 的欢迎页了!
创建 nginx 控制脚本
vim nginx
并将下面代码内容 保存至 创建的 nginx 控制脚本
#! /bin/sh
### 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
PATH=/opt/bin:/opt/sbin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/server/nginx/sbin/nginx
PID=/usr/local/server/nginx/logs
NAME=nginx
DESC=nginx
test -x $DAEMON || exit 0
# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
. /etc/default/nginx
fi
set -e
case "$1" in
start)
echo -n "Starting $DESC: "
start-stop-daemon --start --quiet --pidfile $PID/nginx.pid \
--exec $DAEMON -- $DAEMON_OPTS
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --stop --quiet --pidfile $PID/nginx.pid \
--exec $DAEMON
echo "$NAME."
;;
restart|force-reload)
echo -n "Restarting $DESC: "
start-stop-daemon --stop --quiet --pidfile \
$PID/nginx.pid --exec $DAEMON
sleep 1
start-stop-daemon --start --quiet --pidfile \
$PID/nginx.pid --exec $DAEMON -- $DAEMON_OPTS
echo "$NAME."
;;
reload)
echo -n "Reloading $DESC configuration: "
start-stop-daemon --stop --signal HUP --quiet --pidfile $PID/nginx.pid \
--exec $DAEMON
echo "$NAME."
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac
exit 0
将创建的 nginx 控制脚本加入系统服务,并且给予可执行权限。
mv nginx /etc/init.d
chmod +x /etc/init.d/nginx
设置 nginx 开机自启动
update-rc.d nginx defaults
将 nginx 加入系统环境变量
[ -z "$(grep ^'export PATH=' /etc/profile)" ] && echo "export PATH=/usr/local/server/nginx/sbin:\$PATH" >> /etc/profile
[ -n "$(grep ^'export PATH=' /etc/profile)" -a -z "$(grep /usr/local/server/nginx /etc/profile)" ] && sed -i "s@^export PATH=\(.*\)@export PATH=/usr/local/server/nginx/sbin:\1@" /etc/profile
. /etc/profile
这样平滑重启啥的就能用了。
编译安装 MySQL,我用的是 Mariadb
首先,下载源码,并且解压进入到源码目录
wget https://mirrors.shu.edu.cn/mariadb//mariadb-10.2.19/source/mariadb-10.2.19.tar.gz
tar -xvzf mariadb-10.2.19.tar.gz
cd mariadb-10.2.19
安装一些 mysql 需要的库
apt-get install -y libncurses5-dev libssl-dev
创建 mysql 的运行用户
useradd -M -s /sbin/nologin mysql
创建 mysql 安装目录
mkdir /usr/local/server/mysql
MySQL编译配置
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/server/mysql \
-DMYSQL_DATADIR=/usr/local/server/mysql/data \
-DWITH_INNODB_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_CSV_STORAGE_ENGINE=1 \
-DENABLE_DTRACE=0 \
-DWITH_EMBEDDED_SERVER=1 \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci
然后 编译安装
make && make install
配置开机启动(控制)脚本
cp /usr/local/server/mysql/support-files/mysql.server /etc/init.d/mysqld
sed -i "s@^basedir=.*@basedir=/usr/local/server/mysql@" /etc/init.d/mysqld
sed -i "s@^datadir=.*@datadir=/usr/local/server/mysql/data@" /etc/init.d/mysqld
给予(控制)脚本可执行权限
chmod +x /etc/init.d/mysqld
初始安装数据库
/usr/local/server/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/server/mysql --datadir=/usr/local/server/mysql/data
拷贝 预设 配置文件到 mysql 安装根目录(我没有设置,因此默认位置在mysql根目录)
cp /usr/local/server/mysql/support-files/my-medium.cnf /usr/local/server/mysql/my.cnf
修改 mysql 配置文件
cat > /usr/local/server/mysql/my.cnf << EOF
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8mb4
[mysqld]
port = 3306
socket = /tmp/mysql.sock
basedir = /usr/local/server/mysql
datadir = /usr/local/server/mysql/data
user = mysql
bind-address = 0.0.0.0
server-id = 1
init-connect = 'SET NAMES utf8mb4'
character-set-server = utf8mb4
skip-name-resolve
#skip-networking
back_log = 300
max_connections = 1000
max_connect_errors = 6000
open_files_limit = 65535
table_open_cache = 128
max_allowed_packet = 500M
binlog_cache_size = 1M
max_heap_table_size = 8M
tmp_table_size = 16M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
sort_buffer_size = 8M
join_buffer_size = 8M
key_buffer_size = 4M
thread_cache_size = 8
query_cache_type = 1
query_cache_size = 8M
query_cache_limit = 2M
ft_min_word_len = 4
log_bin = mysql-bin
binlog_format = mixed
expire_logs_days = 7
log_error = /usr/local/server/mysql/data/mysql-error.log
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /usr/local/server/mysql/data/mysql-slow.log
performance_schema = 0
#lower_case_table_names = 1
skip-external-locking
default_storage_engine = InnoDB
innodb_file_per_table = 1
innodb_open_files = 500
innodb_buffer_pool_size = 64M
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 32M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
bulk_insert_buffer_size = 8M
myisam_sort_buffer_size = 8M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
interactive_timeout = 28800
wait_timeout = 28800
[mysqldump]
quick
max_allowed_packet = 500M
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
EOF
启动 mysql
service mysqld start
设置 mysql 开机启动
update-rc.d mysqld defaults
设置root密码 并且 删掉一些没有密码的用户
/usr/local/server/mysql/bin/mysql -e "grant all privileges on *.* to root@'127.0.0.1' identified by \"123456\" with grant option;"
/usr/local/server/mysql/bin/mysql -e "grant all privileges on *.* to root@'localhost' identified by \"123456\" with grant option;"
/usr/local/server/mysql/bin/mysql -uroot -p123456 -e "delete from mysql.user where Password='';"
/usr/local/server/mysql/bin/mysql -uroot -p123456 -e "delete from mysql.db where User='';"
/usr/local/server/mysql/bin/mysql -uroot -p123456 -e "delete from mysql.proxies_priv where Host!='localhost';"
/usr/local/server/mysql/bin/mysql -uroot -p123456 -e "reset master;"
将 mysql 加入系统环境变量
[ -z "$(grep ^'export PATH=' /etc/profile)" ] && echo "export PATH=/usr/local/server/mysql/bin:\$PATH" >> /etc/profile
[ -n "$(grep ^'export PATH=' /etc/profile)" -a -z "$(grep /usr/local/server/mysql /etc/profile)" ] && sed -i "s@^export PATH=\(.*\)@export PATH=/usr/local/server/mysql/bin:\1@" /etc/profile
. /etc/profile
退出 mysql 源码目录
cd ../
安装 PHP
首先是 安装 相关 的依赖库
apt-get install -y autoconf2.64 automake1.11 libtool re2c bison libxml2-dev pkg-config libbz2-dev libcurl4-openssl-dev libwebp-dev libjpeg-dev libpng++-dev libxpm-dev libfreetype6-dev libc-client2007e-dev libicu-dev libreadline-dev libxslt1-dev
然后下载 php 和相关的软件源码
wget http://jp2.php.net/distributions/php-7.2.12.tar.gz
wget https://github.com/P-H-C/phc-winner-argon2/archive/20171227.tar.gz
wget https://libzip.org/download/libzip-1.5.1.tar.gz
解压 安装 argon2 加解密库(可选,不安装 需要删掉 PHP 的 configure 配置项)
# 先安装 argon2 加解密库
tar -xvzf 20171227.tar.gz
cd phc-winner-argon2-20171227
make && make install
cd ../
解压 安装 libzip
tar -xvzf libzip-1.5.1.tar.gz
cd libzip-1.5.1
mkdir build
cd build
cmake ..
make && make install
cd ../../
解压 并 进入 php 源码目录
tar -xvzf php-7.2.12.tar.gz
cd php-7.2.12
然后就是执行 configure
./configure \
--prefix=/usr/local/server/php \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-mysqlnd \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--with-openssl \
--with-zlib-dir \
--enable-bcmath \
--with-bz2 \
--enable-zip \
--with-libzip \
--enable-calendar \
--with-curl \
--enable-exif \
--with-pcre-dir \
--enable-ftp \
--with-gd \
--with-webp-dir \
--with-jpeg-dir \
--with-png-dir \
--with-xpm-dir \
--with-freetype-dir \
--with-gettext \
--with-mhash \
--with-imap \
--with-kerberos \
--with-imap-ssl \
--enable-intl \
--with-icu-dir=/usr \
--enable-mbstring \
--enable-sockets \
--with-password-argon2 \
--enable-wddx \
--with-libxml-dir \
--with-xmlrpc \
--with-xsl \
--with-iconv-dir \
--with-pear \
--enable-shmop \
--enable-soap \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--with-readline \
--enable-opcache
然后 编译安装
make && make install
拷贝预设 php.ini-production 文件到指定的路径 并且 重命名为 php.ini
cp php.ini-production /usr/local/server/php/lib/php.ini
拷贝预设 php-fpm.conf.default 文件到指定的路径 并且 重命名为 php-fpm.conf
cp /usr/local/server/php/etc/php-fpm.conf.default /usr/local/server/php/etc/php-fpm.conf
拷贝预设 www.conf.default 文件到指定的路径 并且 重命名为 www.conf
cp /usr/local/server/php/etc/php-fpm.d/www.conf.default /usr/local/server/php/etc/php-fpm.d/www.conf
复制 php-fpm 控制脚本到指定的位置上,加入系统服务。
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
给 php-fpm 控制脚本赋予可执行权限
chmod +x /etc/init.d/php-fpm
将 php 加入系统环境变量
[ -z "$(grep ^'export PATH=' /etc/profile)" ] && echo "export PATH=/usr/local/server/php/bin:\$PATH" >> /etc/profile
[ -n "$(grep ^'export PATH=' /etc/profile)" -a -z "$(grep /usr/local/server/php /etc/profile)" ] && sed -i "s@^export PATH=\(.*\)@export PATH=/usr/local/server/php/bin:\1@" /etc/profile
. /etc/profile
设置 php-fpm 开机自启动
update-rc.d php-fpm defaults
修改 php 配置文件 增强安全性
vim /usr/local/server/php/lib/php.ini
找到 cgi.fix_pathinfo= 将其值设置为0
cgi.fix_pathinfo=0
再启动 php-fpm 服务之前,要确保 php-fpm 以 www 用户 和 www 组 运行
(这是 php7.2的,php5的不在这)
vim /usr/local/server/php/etc/php-fpm.d/www.conf
找到 user 和 group 这两个选项,默认值 是 www
user = www
group = www
然后启动 php-fpm 服务
service php-fpm start
看到返回 Starting php-fpm done 就证明 php-fpm 服务启动成功了!
退出源码目录
cd ../
修改 nginx 配置文件,使其支持 php 应用
vim /usr/local/server/nginx/conf/nginx.conf
将 location 块修改成下面的样子,以添加对 php 文件的支持
location / {
root html;
index index.php index.html index.htm;
}
将 location ~ .php$ 块,左边的 井号注释取消,并修改成下面的样子。
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
include fastcgi_params;
}
然后检查 配置文件 语法正确性
/usr/local/server/nginx/sbin/nginx -t
返回下面的结果就没问题了
nginx: the configuration file /usr/local/server/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/server/nginx/conf/nginx.conf test is successful
然后重启 nginx 应用修改后的配置文件
/usr/local/server/nginx/sbin/nginx -s reload
# 或者
service nginx restart
创建测试文件到站点根目录
echo "<?php phpinfo();?>" > /usr/local/server/nginx/html/index.php
此时,访问你装环境的主机名(ip地址)就能看到 phpinfo 页面啦。