欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CentOS 6.4环境下配置LNMP环境

程序员文章站 2022-06-11 16:14:25
...

1 环境、目标和约定

1.1 环境

项目 项目
架构 X86-64 内存 4G
磁盘 200GB 发行版 Centos 6.4

1.2 安装需求

软件 版本 软件 版本
mysql mysql5.6.21 nginx 1.8.0
redis 3.05 python 2.7

1.3 约定

软件安装使用编译安装的方式,安装目录:/usr/local/qqwebserver,源码放置目录:/usr/local/qqwebserver/src;

2 准备工作

在正式环境配置之前需要做一些准备工作。

2.1 关闭selinux

为何要关闭?概括起来就是配置selinux非常麻烦,投入回报率太低,所以一般运维都会直接给它关掉了事。

vi /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq! #保存退出
setenforce 0 #使配置立即生效

2.2 挂载硬盘

云主机供应商提供的主机默认只挂载了一个50GB左右的磁盘到/,额外的磁盘需要自己单独挂载,挂载命令如下:

fdisk -l
fdisk /dev/sdb #进行分区
mkfs -t ext3 -c /dev/sdb1
mount  /dev/sdb1 /data

如果想每次系统重启都能自动挂载该分区可修改/etc/fstab文件,在最后加一段 /dev/sdb1 /www ext3 defaults 1 2 (格式说明:/dev/sdb1 代表哪个分区 ext3是该分区的格式 defaults 是挂载时所要设定的参数(只读,读写,启用quota等),输入defaults包括的参数有(rw、dev、exec、auto、nouser、async) ,1是使用dump是否要记录,0是不要。 2是开机时检查的顺序,是boot系统文件就为1,其他文件系统都为2,如不要检查就为0)

2.3 软件下载

下载nginx:

wget http://nginx.org/download/nginx-1.6.2.tar.gz

下载MySQL:

wget http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.21.tar.gz

下载cmake(MySQL编译工具):

wget http://www.cmake.org/files/v3.0/cmake-3.0.2.tar.gz

下载pcre (支持nginx伪静态,rewrite模块需要 pcre 库):

wget http://nchc.dl.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz

下载openssl(nginx扩展,ssl 功能需要):

wget http://www.openssl.org/source/openssl-1.0.2g.tar.gz

下载zlib(nginx扩展,gzip模块需要 zlib 库):

wget http://zlib.net/zlib-1.2.8.tar.gz

下载tcl(安装redis之前需要安装tcl,因为redis的make test是使用tcl编写的):

wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz

下载redis:

wget http://download.redis.io/redis-stable.tar.gz

2.4 依赖安装

在正式进行编译安装之前,需要安装一些依赖软件

yum install -y apr* autoconf automake bison bzip2 bzip2* cloog-ppl compat* cpp curl curl-devel fontconfig fontconfig-devel freetype freetype* freetype-devel gcc gcc-c++ gtk+-devel gd gettext gettext-devel glibc kernel kernel-headers keyutils keyutils-libs-devel krb5-devel libcom_err-devel libpng libpng* libpng-devel libjpeg* libsepol-devel libselinux-devel libstdc++-devel libtool* libgomp libxml2 libxml2-devel libXpm* libX* libtiff libtiff* make mpfr ncurses* ntp openssl nasm nasm* openssl-devel patch pcre-devel perl php-common php-gd policycoreutils ppl telnet t1lib t1lib* wget zlib-devel

3 安装mysql

3.1 安装cmake

cd /usr/local/qqwebserver/src
tar zxvf cmake-3.0.2.tar.gz
cd cmake-3.0.2
./configure
make
make install

3.2 安装mysql

准备工作

groupadd mysql #添加mysql组
useradd -g mysql mysql -s /bin/false #创建用户mysql并加入到mysql组,不允许mysql用户直接登录系统
mkdir -p /data/mysql #创建MySQL数据库存放目录
chown -R mysql:mysql /data/mysql #设置MySQL数据库存放目录权限
mkdir -p /usr/local/qqwebserver/mysql #创建MySQL安装目录

源码编译和安装

cd /usr/local/qqwebserver/src #进入软件包存放目录
tar zxvf mysql-5.6.21.tar.gz #解压
cd mysql-5.6.21 #进入目录
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/qqwebserver/mysql -DMYSQL_DATADIR=/data/mysql -DSYSCONFDIR=/etc #配置
make #编译
make install #安装

相关配置

rm -rf /etc/my.cnf #删除系统默认的配置文件(如果默认没有就不用删除)
cd /usr/local/qqwebserver/mysql #进入MySQL安装目录
./scripts/mysql_install_db --user=mysql --basedir=/usr/local/qqwebserver/mysql --datadir=/data/mysql #生成mysql系统数据库
ln -s /usr/local/qqwebserver/mysql/my.cnf /etc/my.cnf #添加到/etc目录的软连接
cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld #把Mysql加入系统启动
chmod 755 /etc/init.d/mysqld #增加执行权限
chkconfig mysqld on #加入开机启动
vi /etc/rc.d/init.d/mysqld #编辑
basedir=/usr/local/qqwebserver/mysql #MySQL程序安装路径
datadir=/data/mysql #MySQl数据库存放目录
:wq! #保存退出
service mysqld start #启动
vi /etc/profile #把mysql服务加入系统环境变量:在最后添加下面这一行
export PATH=$PATH:/usr/local/qqwebserver/mysql/bin
:wq! #保存退出
source /etc/profile #使配置立刻生效
#下面这两行把myslq的库文件链接到系统默认的位置,这样你在编译类似PHP等软件时可以不用指定mysql的库文件地址。
ln -s /usr/local/qqwebserver/mysql/lib/mysql /usr/lib/mysql
ln -s /usr/local/qqwebserver/mysql/include/mysql /usr/include/mysql
ln -s /usr/local/qqwebserver/mysql/lib/libmysqlclient.so.18 /usr/lib64/libmysqlclient.so.18
mkdir /var/lib/mysql #创建目录
ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock #添加软链接
mysql_secure_installation #设置Mysql密码,根据提示按Y 回车输入2次密码

#修改默认的mysql端口(默认的3306是高危端口):
vi /etc/my.cnf,#将下面前面的注释解除,添加下面的信息。
basedir = /usr/local/qqwebserver/mysql
datadir = /data/mysql
port = xxxx

#修改字符编码,mysqld下面添加
character-set-server=utf8

4 安装nginx

4.1 安装pcre

cd /usr/local/qqwebserver/src
mkdir /usr/local/qqwebserver/pcre
tar zxvf pcre-8.37.tar.gz
cd pcre-8.37
./configure --prefix=/usr/local/qqwebserver/pcre
make
make install

4.2 安装openssl

cd /usr/local/qqwebserver/src
mkdir /usr/local/qqwebserver/openssl
 tar zxvf openssl-1.0.2e.tar.gz 
cd openssl-1.0.2e
./config --prefix=/usr/local/qqwebserver/openssl
make
make install
vi /etc/profile
export PATH=$PATH:/usr/local/openssl/bin
:wq!
source /etc/profile

4.4 安装zlib

cd /usr/local/qqwebserver/src
mkdir /usr/local/zlib
tar zxvf zlib-1.2.8.tar.gz
cd zlib-1.2.8
./configure --prefix=/usr/local/qqwebserver/zlib
make
make install

4.5 安装Nginx

groupadd www
useradd -g www www -s /bin/false
cd /usr/local/qqwebserver/src
tar zxvf nginx-1.6.2.tar.gz
cd nginx-1.8.0
./configure --prefix=/usr/local/qqwebserver/nginx --without-http_memcached_module --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-openssl=/usr/local/qqwebserver/src/openssl-1.0.2e --with-zlib=/usr/local/qqwebserver/src/zlib-1.2.8 --with-pcre=/usr/local/qqwebserver/src/pcre-8.37
make
make install
/usr/local/qqwebserver/nginx/sbin/nginx #启动Nginx

编译nginx的时候注意:–with-openssl=/usr/local/qqwebserver/src/openssl-1.0.2e –with-zlib=/usr/local/qqwebserver/src/zlib-1.2.8 –with-pcre=/usr/local/qqwebserver/src/pcre-8.37指向的是源码包解压的路径,而不是安装的路径,否则会报错

连接配置文件

ln -s /usr/local/qqwebserver/nginx/conf.d/nginx.cnf /etc/nginx.cnf

4.6 设置nginx开机启动

vi /etc/rc.d/init.d/nginx #编辑启动文件添加下面内容

#!/bin/sh

# chkconfig: - 85 15

# nginx - this script starts and stops the nginx daemon

# config: /usr/local/qqwebserver/nginx/conf/nginx.conf

# pidfile: /usr/local/qqwebserver/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/qqwebserver/nginx/sbin/nginx"

prog=$(basename $nginx)

NGINX_CONF_FILE="/usr/local/qqwebserver/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
:wq! #保存退出
chmod 775 /etc/rc.d/init.d/nginx #赋予文件执行权限
chkconfig nginx on #设置开机启动
/etc/rc.d/init.d/nginx restart #重启

5 安装python2.7

5.1 编译安装python2.7

mkdir /usr/local/qqwebserver/python
wget https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz
tar xf Python-2.7.11.tgz
cd Python-2.7.11
./configure --prefix=/usr/local/qqwebserver/python
make && make install

5.2 安装 setuptools + pip

这里需要注意,一定要使用 python2.7 来执行相关命令。

cd /usr/local/qqwebserver/python/bin
# First get the setup script for Setuptools:
wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py

# Then install it for Python 2.7 :
./python2.7 ez_setup.py

# Nowinstall pip using the newly installed setuptools:
./easy_install-2.7 pip

./pip2.7install virtualenv
./virtualenv-2.7 cloudphone

# Check the system Python interpreter version:
python --version
# This will show Python 2.6.6

# Activate the my27project sandbox andcheck the versionof the default Python interpreter in it:
source cloudphone/bin/activate
python --version
# This will show Python 2.7.11
deactivate

使用这种安装方法来安装python2.7,可以不影响centos6.4原有的python2.6

5.3 安装mysql python

下载mysql-python
wget http://jaist.dl.sourceforge.net/project/mysql-python/mysql-python/1.2.3/MySQL-python-1.2.3.tar.gz

python setup.py build
python setup.py install

5.4 安装WSGI容器

在这里nginx仅仅是充当一个反向代理服务器,使用python的Flask框架编写的网站程序将会以webservice的形式运行,webservice也有多种形式,例如FastCGI,WSGI等,这本次安装中我们使用WSGI的模式,使用的容器是gunicorn,同时这里使用supervisor来管理服务器进程。
所以最终网站的部署模式是:

nginx+gunicorn+flask+supervisor

安装gunicorn和supervisor

pip install gunicorn
pip install supervisor
echo_supervisord_conf > supervisor.conf   # 生成 supervisor 默认配置文件
vim supervisor.conf                       # 修改 supervisor 配置文件,添加 gunicorn 进程管理

在supervisor.conf的底部添加下面的内容:

[program:myapp]
command=/usr/local/qqwebserver/python/bin/myapp/bin/gunicorn -w4 -b0.0.0.0:6000 manage:app          ; supervisor启动命令 w4表示启动4个进程
directory=/opt/myapp                                                                                ; 项目的文件夹路径
startsecs=0                                                                                         ; 启动时间
stopwaitsecs=0                                                                                      ; 终止等待时间
autostart=false                                                                                     ; 是否自动启动
autorestart=false                                                                                   ; 是否自动重启
stdout_logfile=/opt/myapp/log/gunicorn.log                                    ; log 日志
stderr_logfile=/opt/myapp/log/gunicorn.err                                ; 错误日志

supervisor的基本使用命令

supervisord -c supervisor.conf                             通过配置文件启动supervisor
supervisorctl -c supervisor.conf status                    察看supervisor的状态
supervisorctl -c supervisor.conf reload                    重新载入 配置文件
supervisorctl -c supervisor.conf start [all]|[appname]     启动指定/所有 supervisor管理的程序进程
supervisorctl -c supervisor.conf stop [all]|[appname]      关闭指定/所有 supervisor管理的程序进程

首先使用 supervsior 启动 gunicorn,运行命令

supervisord -c supervisor.conf

然后利用上面的supervisorctl命令管理容器进程。

6 安装redis

6.1 安装tcl

redis的make test是使用tcl语言编写的,因此在编译安装redis之前需要先安装tcl

cd /usr/local/qqwebserver/src #进入软件包存放目录

tar  zxvf  tcl8.6.1-src.tar.gz  #解压

cd tcl8.6.1 #进入安装目录

cd unix

./configure --prefix=/usr   --without-tzdata    --mandir=/usr/share/man $([ $(uname -m) = x86_64 ] && echo --enable-64bit)   #配置

make #编译

sed -e "[email protected]^\(TCL_SRC_DIR='\).*@\1/usr/include'@"  -e "/TCL_B/[email protected]='\(-L\)\?.*[email protected]='\1/usr/[email protected]"  -i tclConfig.sh

make install  #安装

make install-private-headers

ln -v -sf tclsh8.6 /usr/bin/tclsh

chmod -v 755 /usr/lib/libtcl8.6.so

6.2 安装Redis

cd /usr/local/qqwebserver/src

tar -zxvf redis-stable.tar.gz #解压

mv redis-stable  /usr/local/qqwebserver/redis #移动文件到安装目录

cd /usr/local/qqwebserver/redis  #进入安装目录

make #编译

make install #安装

cd  /usr/local/bin #查看是否有下面文件,如果没有,拷贝下面文件到/usr/local/bin目录

cd /usr/local/qqwebserver/redis

mkdir -p /usr/local/bin

cp -p redis-server /usr/local/bin

cp -p redis-benchmark /usr/local/bin

cp -p redis-cli /usr/local/bin

cp -p redis-check-dump /usr/local/bin

cp -p redis-check-aof /usr/local/bin

ln -s  /usr/local/qqwebserver/redis/redis.conf  /etc/redis.conf  #添加配置文件软连接

vi /etc/redis.conf  #编辑

daemonize yes  #设置后台启动redis

:wq! #保存退出

redis-server /etc/redis.conf  #启动redis服务

redis-cli shutdown  #关闭redis

vi /etc/sysctl.conf #编辑,在最后一行添加下面代码

vm.overcommit_memory = 1

:wq! #保存退出

sysctl -p #使设置立即生效

6.3 设置redis开机启动

vi /etc/init.d/redis #编辑,添加以下代码


#!/bin/sh
# chkconfig: 2345 10 90 
# redis    Startup script for redis processes

redis_path="/usr/local/bin/redis-server"

redis_conf="/etc/redis.conf"

redis_pid="/var/run/redis.pid"

# Source function library.

. /etc/rc.d/init.d/functions

[ -x $redis_path ] || exit 0

RETVAL=0

prog="redis"

# Start daemons.

start() {

if [ -e $redis_pid -a ! -z $redis_pid ];then

echo $prog" already running...."

exit 1

fi

echo -n $"Starting $prog "

# Single instance for all caches

$redis_path $redis_conf

RETVAL=$?

[ $RETVAL -eq 0 ] && {

touch /var/lock/subsys/$prog

success $"$prog"

}

echo

return $RETVAL

}

# Stop daemons.

stop() {

echo -n $"Stopping $prog "

killproc -d 10 $redis_path

echo

[ $RETVAL = 0 ] && rm -f $redis_pid /var/lock/subsys/$prog

RETVAL=$?

return $RETVAL

}

# See how we were called.

case "$1" in

start)

start

;;

stop)

stop

;;

status)

status $prog

RETVAL=$?

;;

restart)

stop

start

;;

condrestart)

if test "x`pidof redis`" != x; then

stop

start

fi

;;

*)

echo $"Usage: $0 {start|stop|status|restart|condrestart}"

exit 1

esac

exit $RETVAL
:wq! #保存退出

chmod 755 /etc/init.d/redis  #添加脚本执行权限

chkconfig --add redis  #添加开启启动

6.4 设置redis配置文件参数

mkdir -p /usr/local/qqwebserver/redis/var  #创建redis数据库存放目录

vi /etc/redis.conf  #编辑

daemonize yes  #以后台daemon方式运行redis

pidfile "/var/run/redis.pid"  #redis以后台运行,默认pid文件路径/var/run/redis.pid

port 6543  #默认端口

bind 127.0.0.1 #默认绑定本机所有ip地址,为了安全,可以只监听内网ip

timeout 300 #客户端超时设置,单位为秒

loglevel verbose  #设置日志级别,支持四个级别:debug、notice、verbose、warning

logfile stdout  #日志记录方式,默认为标准输出,logs不写文件,输出到空设备/deb/null

logfile "/usr/local/qqwebserver/redis/var/redis.log"  #可以指定日志文件路径

databases 16  #开启数据库的数量

save 900 1

save 300 10

save 60 10000

#创建本地数据库快照,格式:save * *

#900秒内,执行1次写操作

#300秒内,执行10次写操作

#60秒内,执行10000次写操作

rdbcompression yes #启用数据库lzf压缩,也可以设置为no

dbfilename dump.rdb  #本地快照数据库名称

dir "/usr/local/qqwebserver/redis/var/"   #本地快照数据库存放目录

requirepass doodod123  #设置redis数据库连接密码

maxclients 10000 #同一时间最大客户端连接数,0为无限制

maxmemory 1024MB #设定redis最大使用内存,值要小于物理内存,必须设置

appendonly yes  #开启日志记录,相当于MySQL的binlog

appendfilename "appendonly.aof"   #日志文件名,注意:不是目录路径

appendfsync everysec #每秒执行同步,还有两个参数always、no一般设置为everysec,相当于MySQL事物日志的写方式

:wq! #保存退出