编译安装LNMP
2018-08-16 本文已影响4人
Miracle001
单机运行LNMP
centos1804
yum -y install gcc gcc-c++ openssl-devel cyrus-sasl-md5
yum -y install automake autocon libtool make glibc
下载wget
yum -y install wget
wget https://sourceforge.net/projects/pcre/files/pcre/8.41/pcre-8.41.tar.gz
tar xzvf pcre-8.41.tar.gz
下载zlib
wget https://sourceforge.net/projects/libpng/files/zlib/1.2.11/zlib-1.2.11.tar.gz
tar xzvf zlib-1.2.11.tar.gz
下载openssl
wget https://www.openssl.org/source/openssl-1.1.0b.tar.gz
tar -zxvf openssl-1.1.0b.tar.gz
为nginx添加用户及组
groupadd -r www
useradd -r -g www www
编译安装nginx
cd /root/
下载nginx
wget http://nginx.org/download/nginx-1.10.2.tar.gz
tar xzvf nginx-1.10.2.tar.gz
mkdir -pv /alidata/{server,webapps,logs,packages}
cd nginx-1.10.2
./configure --prefix=/alidata/server/nginx-1.10.2 --sbin-path=/alidata/server/nginx-1.10.2/sbin/nginx --conf-path=/alidata/server/nginx-1.10.2/nginx.conf --pid-path=/alidata/server/nginx-1.10.2/nginx.pid --user=www --group=www --with-http_ssl_module --with-http_flv_module --with-http_mp4_module --with-http_stub_status_module --with-select_module --with-poll_module --error-log-path=/alidata/logs/nginx/error.log --http-log-path=/alidata/logs/nginx/access.log --with-pcre=/root/pcre-8.41 --with-zlib=/root/zlib-1.2.11 --with-openssl=/root/openssl-1.1.0b
make && make install
--prefix表示nginx要安装到哪个路径下,这里指定刚才新建好的/alidata/server目录下的nginx-1.12.2;
--sbin-path表示nginx的可执行文件存放路径
--conf-path表示nginx的主配置文件存放路径,nginx允许使用不同的配置文件启动,通过命令行中的-c选项
--pid-path表示nginx.pid文件的存放路径,将存储的主进程的进程号。安装完成后,可以随时改变的文件名 , 在nginx.conf配置文件中使用 PID指令。默认情况下,文件名 为prefix/logs/nginx.pid
--error-log-path表示nginx的主错误、警告、和诊断文件存放路径
--http-log-path表示nginx的主请求的HTTP服务器的日志文件的存放路径
--user表示nginx工作进程的用户
--group表示nginx工作进程的用户组
--with-select_module或--without-select_module表示启用或禁用构建一个模块来允许服务器使用select()方法
--with-poll_module或--without-poll_module表示启用或禁用构建一个模块来允许服务器使用poll()方法
--with-http_ssl_module表示使用https协议模块。默认情况下,该模块没有被构建。建立并运行此模块的OpenSSL库是必需的
--with-pcre表示pcre的源码路径,因为解压后的pcre是放在root目录下的,所以是/root/pcre-8.41;
--with-zlib表示zlib的源码路径,这里因为解压后的zlib是放在root目录下的,所以是/root/zlib-1.2.11
--with-openssl表示openssl库的源码路径
编译安装完成
安装成功后,可以看到在/alidata/server目录下,多出了一个nginx-1.10.2,里面即是nginx的实际运行程序。
设置nginx配置文件
cd /alidata/server/nginx-1.10.2
mkdir -pv conf/vhosts
mkdir /alidata/logs/nginx/{access,error}
mkdir /alidata/server/nginx-1.10.2/logs
vim /alidata/server/nginx-1.10.2/nginx.conf
user www www;
worker_processes 2;
error_log /alidata/logs/nginx/error.log crit;
pid /alidata/server/nginx-1.10.2/logs/nginx.pid;
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 65535;
}
http {
include mime.types;
default_type application/octet-stream;
access_log /alidata/logs/nginx/access.log;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
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 128k;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
include /alidata/server/nginx-1.10.2/conf/vhosts/*.conf;
include /alidata/server/nginx-1.10.2/conf/proxy/*.conf;
}
引用了/alidata/server/nginx-1.10.2/conf/vhosts/目录下所有后缀名是.conf的配置文件,
现在进入该目录编写一个默认配置文件default.conf,其内容是
vim /alidata/server/nginx-1.10.2/conf/vhosts/default.conf
server {
listen 80;
server_name localhost;
index index.html;
root /alidata/webapps;
#charset koi8-r;
#access_log logs/host.access.log main;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
}
location ~ .*\.(js|css)?$ {
expires 1h;
}
#伪静态规则
include /alidata/server/nginx-1.10.2/conf/rewrite/default.conf;
access_log /alidata/logs/nginx/access/default.log;
error_log /alidata/logs/nginx/error/default.log;
}
其中引入了一个/alidata/server/nginx-1.10.2/conf/rewrite/default.conf文件,
这个文件是用来编写rewrite规则的配置文件,用来实现伪静态,其内容是
mkdir /alidata/server/nginx-1.10.2/conf/rewrite
vim /alidata/server/nginx-1.10.2/conf/rewrite/default.conf
rewrite ^(.*)-htm-(.*)$ $1.php?$2 last;
rewrite ^(.*)/simple/([a-z0-9\_]+\.html)$ $1/simple/index.php?$2 last;
rewrite ^(.*)/data/(.*)\.(html|php)$ 404.html last;
rewrite ^(.*)/attachment/(.*)\.(html|php)$ 404.html last;
rewrite ^(.*)/html/(.*)\.(html|php)$ 404.html last;
启动完成
/alidata/server/nginx-1.10.2/sbin/nginx
ps aux |grep nginx
ps -e |grep nginx
加入系统环境变量
vim /etc/profile
在文件最末尾加上如下代码
export NGINX_HOME=/alidata/server/nginx-1.10.2
export PATH=$PATH:$NGINX_HOME/sbin
. /etc/profile 重读配置文件 或者 source /etc/profile
echo $PATH
命令查看环境变量中是否已经加入了相关的路径
加入系统环境变量
加入系统服务
在/etc/init.d/目录下创建一个nginx文件
vim /etc/init.d/nginx 文件内容如下
#!/bin/bash
# chkconfig: - 85 15
PATH=/alidata/server/nginx-1.10.2
DESC="nginx daemon"
NAME=nginx
DAEMON=$PATH/sbin/$NAME
CONFIGFILE=$PATH/$NAME.conf
PIDFILE=$PATH/logs/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
set -e
[ -x "$DAEMON" ] || exit 0
do_start() {
$DAEMON -c $CONFIGFILE || echo -n "nginx already running"
}
do_stop() {
$DAEMON -s stop || echo -n "nginx not running"
}
do_reload() {
$DAEMON -s reload || echo -n "nginx can't reload"
}
case "$1" in
start)
echo -n "Starting $DESC: $NAME"
do_start
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
do_stop
echo "."
;;
reload|graceful)
echo -n "Reloading $DESC configuration..."
do_reload
echo "."
;;
restart)
echo -n "Restarting $DESC: $NAME"
do_stop
do_start
echo "."
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|reload|restart}"
exit 3
;;
esac
exit 0
其中,需要注意几个变量,分别是PATH、NAME、DAEMON、CONFIGFILE、PIDFILE、SCRIPTNAME,
其中,PATH设置为nginx的安装路径,
DAEMON设置为nginx启动脚本的路径,
CONFIGFILE是nginx.conf文件的路径,
PIDFILE是进程文件的路径,需要与nginx.conf文件中的配置一致,
SCRIPTNAME则是要指向当前文件路径/etc/init.d/nginx
将上述文件保存后,一定要记得给其赋予可执行的权限,具体命令如下
chmod +x /etc/init.d/nginx
至此,我们已将nginx加入了系统服务,
由于本文描述的实在CentOS 7环境下安装,
所以与CentOS 6不同的是,不再使用类似于 service nginx start 这样的命令来开启或者关闭服务,
而是使用如下命令开启和关闭服务
首先要确认之前打开的nginx进程已被杀死,
ps aux|grep nginx;kill 28150
其次可以尝试先执行
/bin/systemctl start nginx
显示"Failed to start nginx.service: Unit not found."
ps aux|grep nginx 没有启动成功
systemctl enable nginx 或者 /sbin/chkconfig nginx on 设置nginx开机自启动
显示:
"nginx.service is not a native service, redirecting to /sbin/chkconfig."
"Executing /sbin/chkconfig nginx on"
执行:echo $? 0--ok
/bin/systemctl start nginx
ps aux|grep nginx 启动成功
其他命令:不用执行
/bin/systemctl stop nginx
/bin/systemctl reload nginx
编译安装PHP
cd /root/
下载地址:http://php.net/releases/
包名:php-7.0.30.tar.gz
解压:tar xzvf php-7.0.30.tar.gz
下载bz2压缩包,需要:yum -y install bzip2; tar -jxvf php-7.0.30.tar.bz2
安装依赖包
yum -y install libjpeg libjpeg-devel libpng libpng-devel freetype-devel libxml2 libxml2-devel mysql pcre-devel curl-devel libxslt-devel gcc openssl-devel libmcrypt-devel
编译时报错:configure: error: Cannot find OpenSSL's <evp.h>
yum -y install openssl-devel,已安装忽略
编译时报错:configure: error: mcrypt.h not found. Please reinstall libmcrypt
yum -y install libmcrypt-devel,已安装忽略
cd php-7.0.30/
编译:
./configure --prefix=/alidata/server/php-7.0.30 --with-config-file-path=/alidata/server/php-7.0.30/etc --with-curl --with-freetype-dir --with-gd --with-gettext --with-iconv-dir --with-kerberos --with-libdir=lib64 --with-libxml-dir --with-mysqli --with-openssl --with-pcre-regex --with-pdo-mysql --with-pdo-sqlite --with-pear --with-png-dir --with-xmlrpc --with-xsl --with-zlib --with-zlib-dir --with-mhash --with-mcrypt --with-openssl-dir --with-jpeg-dir --enable-gd-jis-conv --enable-fpm --enable-bcmath --enable-libxml --enable-inline-optimization --enable-gd-native-ttf --enable-mbregex --enable-mbstring --enable-opcache --enable-pcntl --enable-shmop --enable-soap --enable-sockets --enable-sysvsem --enable-xml --enable-maintainer-zts --enable-zip
执行完成,如下图1
make
make install
编译成功,如下图2
1
2
设置php配置文件
将官方提供的配置模板拷贝到配置参数中所指定的目录中
cp php.ini-production /alidata/server/php-7.0.30/etc/php.ini
然后可以根据自己服务器的需求,对php.ini文件的内容进行修改
设置php-fpm配置文件,依次执行以下命令
cd /alidata/server/php-7.0.30/etc/
cp php-fpm.conf.default php-fpm.conf
vim php-fpm.conf 内容进行如下修改
pid = /alidata/server/php-7.0.30/var/run/php-fpm.pid
cd /alidata/server/php-7.0.30/etc/php-fpm.d/
cp www.conf.default www.conf
vim www.conf 内容进行如下修改
user = www
group = www
listen = 127.0.0.1:9000
pm.max_children = 100
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
其他配置可根据自己的情况进行相应修改
启动php-fpm
完成以上配置后,即可启动php-fpm,执行以下命令
/alidata/server/php-7.0.30/sbin/php-fpm
ps aux | grep php-fpm
命令查看进程,若能够看到相关进程,则证明启动成功。查询进程时,可以看到进程是以www用户身份执行的
加入系统环境变量
vim /etc/profile 在文件最末尾加上如下代码
export PHP_HOME=/alidata/server/php-7.0.30
export PATH=$PATH:$PHP_HOME/bin:$PATH_HOME/sbin
重新加载配置文件
source /etc/profile
或者 . /etc/profile
echo $PATH 查看环境变量中是否已经加入了相关的路径
加入系统变量
加入系统服务
vim /etc/init.d/php-fpm
文件内容如下
#!/bin/bash
# php-fpm startup script for the php-fpm
# php-fpm version:7.0.30
# chkconfig: - 85 15
# description: php-fpm
# processname: php-fpm
# pidfile: /alidata/server/php-7.0.30/var/run/php-fpm.pid
# config: /alidata/server/php-7.0.30/etc/php-fpm.conf
php_command=/alidata/server/php-7.0.30/sbin/php-fom
php_config=/alidata/server/php-7.0.30/etc/php-fpm.conf
php_pid=/alidata/server/php-7.0.30/var/run/php-fpm.pid
RETVAL=0
prog="php-fpm"
#start function
php_fpm_start() {
/alidata/server/php-7.0.30/sbin/php-fpm
}
start(){
if [ -e $php_pid ]
then
echo "php-fpm already start..."
exit 1
fi
php_fpm_start
}
stop(){
if [ -e $php_pid ]
then
parent_pid=`cat $php_pid`
all_pid=`ps -ef | grep php-fpm | awk '{if('$parent_pid' == $3){print $2}}'`
for pid in $all_pid
do
kill $pid
done
kill $parent_pid
fi
exit 1
}
restart(){
stop
start
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|status}"
exit 1
esac
exit $RETVAL
其中
php_command表示php-fpm可执行脚本的路径,
php_config表示php-fpm的配置文件路径,
php_pid表示php-fpm进程文件的路径
设置php-fpm开机自启动
经过上面的操作,php-fpm已被添加为系统服务,所以可以将其设置为开机自启动,
这样就可以避免每次服务器重启之后需要手动开启php-fpm的操作,具体命令如下
chkconfig --add php-fpm
chkconfig php-fpm on
或者
systemctl enable php-fpm
配置Nginx+PHP
与Apache服务器不同的是,Nginx本身并不解释、运行PHP代码,
Nginx只是将用户端发来的HTTP请求进行转发,
真正解释运行PHP代码的是php-fpm进程,
所以,这里只需要将Nginx收到的http请求转发给php-fpm即可。
根据本文前序步骤,已经完成了Nginx和PHP的安装和配置,
接下来,只需要在Nginx的配置文件中加入转发至php-fpm的配置即可。
配置Nginx+PHP
本文中对Nginx进行了多域名配置,
每个域名只需要在/alidata/server/nginx-1.10.2/conf/vhosts目录下有一个自己的配置文件即可,
所以重点就在这个配置文件里,
现在假定我们需要查看当前服务器的php信息,因为本文没有涉及到域名解析及配置的相关信息,
所以这里就以IP访问为例进行配置讲解,
首先,需要在我们的web代码根路径/alidata/webapps下创建一个info.php文件,执行以下命令
vim /alidata/webapps/info.php
<?php
phpinfo();
?>
对Nginx的配置文件进行修改
前文已经在/alidata/server/nginx-1.10.2/conf/vhosts目录下创建了default.conf配置文件,
现在对这个文件的内容进行修改,修改后的内容如下
vim /alidata/server/nginx-1.10.2/conf/vhosts/default.conf
server {
listen 80;
server_name localhost;
index index.php index.htm index.html;
root /alidata/webapps;
location ~ .*\.(php|php5)?$ {
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
#charset koi8-r;
#access_log logs/host.access.log main;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
}
location ~ .*\.(js|css)?$ {
expires 1h;
}
# 配置页面静态化
include /alidata/server/nginx-1.10.2/conf/rewrite/default.conf;
access_log /alidata/logs/nginx/access/default.log;
error_log /alidata/logs/nginx/error/default.log;
}
与之前的配置文件相比,主要是index配置项后,多了关于php的配置内容,
以及location相关配置中,多了对于php的内容,保存以上配置文件。
重新加载配置文件
nginx -t
nginx -s reload
通过浏览器访问:http://服务器的IP/info.php
http://192.168.25.101/info.php
有时候,界面显示"file not "需要等1-2分钟才会刷新出来
上文中php代码的运行效果,具体如下图所示
php代码运行结果
至此,即完成了Nginx和PHP的配置。上述的配置只是最简单的配置;
若项目不是运行在web根目录下的,那么配置文件也需要对应的进行修改;
若项目是采用CodeIgniter或Laravel等其他框架技术开发的,那么也需要对配置文件进行相应修改;
这部分内容大家可自行百度,有很多相关的博客。
安装MySQL
下载安装cmake
cd /root/
wget https://cmake.org/files/v3.10/cmake-3.10.0-rc5.tar.gz
tar -xzvf cmake-3.10.0-rc5.tar.gz
cd cmake-3.10.0-rc5
./configure --prefix=/alidata/package/cmake
make && make install
export PATH=/package/cmake/bin:$PATH
下载并安装ncurses
cd /root/
wget http://ftp.gnu.org/gnu/ncurses/ncurses-6.0.tar.gz
tar -xzvf ncurses-6.0.tar.gz
cd ncurses-6.0
./configure --prefix=/alidata/package/ncurses
make
make install
安装libaio库
yum -y install libaio* 会安装libaio和libaio-devel这两个库
为MySQL添加用户及组
为了保证操作系统的安全,这里为mysql工作进程创建专用的用户
groupadd mysql
useradd -r -g mysql mysql
下载MySQL
https://dev.mysql.com/downloads/mysql/5.7.html#downloads
下载包
rz 上传mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz
tar xzvf mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.23-linux-glibc2.12-x86_64 /alidata/server/mysql-5.7.23/ 改名并移动此处
使用的是mysql官方提供的解压缩版的安装方式,不需要进行make操作。
将mysql文件夹移动到安装路径后,需要修改mysql安装文件夹的权限
chown -R mysql.mysql /alidata/server/mysql-5.7.23/
后续如果在该目录及其子目录下创建了任何文件和文件夹,
均需要再次执行该命令,以确保mysqld进程对该文件夹具有完全的读写权限
设置mysql配置文件
vim /etc/my.cnf 具体配置如下
[client]
port = 3306
socket = /alidata/server/mysql-5.7.23/tmp/mysql.sock
[mysqld]
basedir=/alidata/server/mysql-5.7.23/
datadir=/alidata/server/mysql-5.7.23/data
socket=/alidata/server/mysql-5.7.23/tmp/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
log-error=/alidata/logs/mysql/error.log
pid-file=/alidata/logs/mysql/mysql.pid
[mysqld_safe]
log-error=/alidata/logs/mariadb/error.log
pid-file=/alidata/logs/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
这里需要注意,配置文件最后一行引入了新的配置文件,my.cnf.d目录下名为mysql-clients.cnf的配置文件
cd /alidata/server/mysql-5.7.23/
mkdir tmp
touch tmp/mysql.sock
chown -R mysql:mysql tmp
mkdir data
chown -R mysql:mysql data
cd /alidata/logs/
mkdir mysql
touch mysql/{error.log,mysql.pid}
chown -R mysql:mysql mysql
mkdir mariadb
touch mariadb/{error.log,mariadb.pid}
chown -R mysql:mysql mariadb
在my.cnf配置文件中,需要注意几个配置,其中
basedir指的是mysql的安装目录,
datadir指的是mysql数据文件的存储目录,
其他几项配置项,可以查看官方解释。
特别说明一个问题是,
所有在配置文件中出现的路径、文件均需要具有可读写的权限,前面为MySQL创建了用户及组,
所以上述配置文件中涉及到的路径和文件,均需要将其所有者及组指定为mysql用户,这样MySQL服务才能正常启动。
完成以上配置后,需要将mysqld的启动脚本放入/etc/init.d/路径中,执行以下命令
cp -a /alidata/server/mysql-5.7.23/support-files/mysql.server /etc/init.d/mysqld
修改/etc/init.d/mysqld中的basedir和datadir,确保其值与my.cnf文件中的内容相同
vim /etc/init.d/mysqld
basedir=/alidata/server/mysql-5.7.23/
datadir=/alidata/server/mysql-5.7.23/data
初始化MySQL
因是MySQL 5.7.20版本,所以不能使用mysql_install_db命令
需要使用 mysqld -initialize 命令对数据库进行初始化,具体命令如下
/alidata/server/mysql-5.7.23/bin/mysqld --initialize --user=mysql --basedir=/alidata/server/mysql-5.7.23/ --datadir=/alidata/server/mysql-5.7.23/data/
若前面配置文件中的各配置项均正确,各路径、文件均存在并可读写,
此命令将提示执行成功,并能够在/root/目录下生成一个.mysql_secret文件,
使用cat命令可查看其内容,其是mysql中本地root用户的初始密码。
这里需要特别说明一下,如果没有显示随机密码,可以在日志中找到;
cat /alidata/logs/mysql/error.log
显示"...A temporary password is generated for root@localhost: q&JdC3>,4?KG"
密码:q&JdC3>,4?KG
启动,后台运行
/alidata/server/mysql-5.7.23/bin/mysqld_safe --user=mysql &
登陆并修改密码
/alidata/server/mysql-5.7.23/bin/mysql -uroot -p'q&JdC3>,4?KG'
set password for 'root'@localhost = password('qianggedu');
flush privileges;
quit
/alidata/server/mysql-5.7.23/bin/mysql -uroot -p
输入密码,成功登陆,OK
设置MySQL服务开机自启 依次执行以下命令
cd /alidata/server/mysql-5.7.23/
chkconfig --level 35 mysqld on
启动MySQL服务
ps aux |grep mysql
root 84166 0.0 0.1 113312 1660 pts/0 S 16:15 0:00 /bin/sh /alidata/server/mysql-5.7.23/bin/mysqld_safe --user=mysql
mysql 84341 0.1 17.2 1182948 172180 pts/0 Sl 16:15 0:01 /alidata/server/mysql-5.7.23/bin/mysqld --basedir=/alidata/server/mysql-5.7.23/ --datadir=/alidata/server/mysql-5.7.23/data --plugin-dir=/alidata/server/mysql-5.7.23//lib/plugin --user=mysql --log-error=/alidata/logs/mariadb/error.log --pid-file=/alidata/logs/mariadb/mariadb.pid --socket=/alidata/server/mysql-5.7.23/tmp/mysql.sock
root 85266 0.0 0.0 112704 976 pts/0 R+ 16:35 0:00 grep --color=auto mysql
使用kill命令将其全部杀掉
kill 84341 杀掉主的,其他自动断掉
启动MySQL服务
/etc/init.d/mysqld start
显示:Starting MySQL. SUCCESS!
ss -ntl 3306端口出现
接下来,使用root用户登录,然后进行创建用户,创建数据库,赋权等操作,属于MySQL的基本操作,不赘述。