前置文章:

CentOS+Nginx+Tomcat+Mysql+PHP 环境篇

六、环境安装

现在开始正式配置各种应用环境。

6.1 环境的预装

yum install -y make cmake gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers  gd gd-devel perl expat expat-devel nss_ldap unixODBC-devel libxslt-devel libevent-devel libtool-ltdl bison libtool zip unzip gmp-devel pcre pcre-devel python-devel  perl-devel perl-ExtUtils-Embed  //安装各种环境所需要的插件
yum update -y    //升级补丁

6.2 安装iptables(可不安装)

yum install -y iptables-services  //安装iptables
systemctl enable iptables    //开机自启动
service iptables start    //启动服务
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT //允许远程访问mysql
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT //允许远程访问http
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT //允许远程访问https
service iptables save   //保存相关操作配置
systemctl stop iptables.service   //关闭iptables服务

设置iptables规则

6.2.1 清除所有规则,所有设置从头开始
iptables -F        //清除预设表filter中的所有规则链的规则
iptables -X        //清除预设表filter中使用者自定链中的规则
service iptables save     //保存结果,否则重启后又恢复原来的状态

查询结果:

iptables -L -n
Chain INPUT (policy ACCEPT)
target       prot opt source                 destination       
Chain FORWARD (policy ACCEPT)
target       prot opt source                 destination       
Chain OUTPUT (policy ACCEPT)
target       prot opt source                 destination    `
6.2.2 设定预设规则
iptables -A INPUT -p tcp --dport 22 -j ACCEPT   //允许所有IP,访问22端口(流入)
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT  //允许所有IP,访问22端口(流出)
iptables -I INPUT -s 10.17.162.137 -p tcp --dport 22 -j ACCEPT  //指定IP访问指定端口
iptables -I OUTPUT -s 10.17.162.137 -p tcp --sport 22 -j ACCEPT  //若流出被禁止,则需要追加该条规则

段落引用注:优先允许SSH端口,否则,在执行下面的规则时,将会直接失去连接,无法管理远程机器。

iptables -P INPUT DROP     //禁止所有流入规则
iptables -P OUTPUT ACCEPT   //允许所有流出规则
iptables -P FORWARD DROP   //禁止所有转发规则
service iptables save     //保存结果,否则重启后又恢复原来的状态

段落引用php-fpm访问的时候,需要用到以下规则,否则将无法访问php文件。

iptables -A INPUT -i lo -j ACCEPT   //允许来自于lo接口接收数据包
iptables -A OUTPUT -o lo -j ACCEPT   //允许向lo接口发送数据包

注:上述规则可根据实际情况而定,而iptables -A的意思是添加到当前规则的最后一条;而iptables -I的意思是添加到当前规则的某一个位置,默认为第一条,若是iptables -I 3 则意思是在第三条插入。

iptables -A INPUT -p tcp --dport 53 -j ACCEPT   //开放53端口,DNS端口,否则无法使用yum安装
iptables -A INPUT -p udp --dport 53 -j ACCEPT   //开放53端口,DNS端口,否则无法使用yum安装
iptables -A INPUT -p tcp --dport 80 -j ACCEPT   //开放80端口
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT   //tomcat服务需用到的端口
iptables -I INPUT 2 -m state --state RELATED,ESTABLISHED -j ACCEPT  //tomcat服务需要
iptables -A INPUT -p tcp --dport 443 -j ACCEPT   //开放443端口
允许icmp包通过,也就是允许ping,
iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话)
iptables -A INPUT -p icmp -j ACCEPT    (INPUT设置成DROP的话)
iptables -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)
iptables -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)
丢弃坏的TCP包
[root@tp ~]#iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
处理IP碎片数量,防止被外界攻破,允许每秒100个
iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包.
iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
防止外网用内网IP欺骗
iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP
禁止与某个具体IP的所有连接
iptables -t nat -A PREROUTING -d ip地址(0.0.0.0) -j DROP
禁用FTP(21)端口
iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP
禁止某个IP连接FTP(21)端口.
iptables -t nat -A PREROUTING    -p tcp --dport 21 -d ip地址 -j DROP
drop非法连接
iptables -A INPUT     -m state --state INVALID -j DROP
iptables -A OUTPUT    -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
允许所有已经建立的和相关的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
保存并重启
service iptables save
service iptables restart

6.3、安装mysql及初始设置mysql

yum install -y bison-devel libaio-devel  //预装mysql环境
yum install -y perl-Data-Dumper  //预装mysql所需环境 
yum install -y mysql-server   //安装mysqld
service mysqld start  //启动mysql
systemctl enable mysqld.service  //开机自启动
grep 'temporary password' /var/log/mysqld.log     //mysql5.7版本后,初始密码不再为空,默认随机生成,可通过该命令查询
mysql -u root -p   //进入mysql
alter user root@localhost identified by '三种或以上的八位字符';   默认需要先修改密码,才能其他操作
exit;    //退出mysql管理
设置mysql 不分大小写
vi /etc/my.cnf
[mysqld]
lower_case_table_names=1       //必须在[mysqld] 中
配置mysql支持UTF-8
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
lower_case_table_names=1 
character-set-server=utf8
max_connections=500
innodb_log_file_size=60M
innodb_buffer_pool_size=128M
symbolic-links=0
interactive_timeout=20                //下面有说明
wait_timeout=20

[client]
default-character-set=utf8
socket=/var/lib/mysql/mysql.sock

[mysqld_safe]
open-files-limit = 8192
log-error=/var/log/mysqld.log
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysqld/mysqld.pid
service mysqld restart  //重启mysql
MySQL运维小知识

MySQL高占用CPU、内存,有可能是由于进程未能及时释放,可以通过简单的设置,可以有效的解决这个问题。

mysql -uroot -p
mysql> show global variables like '%timeout';
mysql> set global interactive_timeout=100;

段落引用上述的,在重启mysqld.service后失效

vi /etc/my.cnf
[mysqld]
interactive_timeout=20
wait_timeout=20

段落引用上述,任何时候都生效

mysql创建远程用户并授权,尽量不建议,因为这样不安全
mysql -uroot -p
mysql> create user root identified by 'Jeson.123.com';
mysql> grant all privileges on *.* to 'root'@'%'identified by 'Jeson.123.com' with grant option;
mysql> flush privileges;
mysql创建数据库
mysql> CREATE DATABASE lottery DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql修改指定用户的密码
update mysql.user set password=password('新密码') where User="test" and Host="localhost";
mysql删除指定用户
delete from user where User='test' and Host='localhost';

6.4、安装PHP环境

yum install -y php56w php56w-cli php56w-common php56w-gd php56w-ldap php56w-mbstring php56w-mcrypt php56w-mysql php56w-pdo php56w-devel
yum install -y traceroute net-snmp-devel vim sysstat tree mysql-devel ntpdate libjpeg* bind-utils
yum install -y php56w-imap php56w-odbc php56w-pear php56w-xml php56w-xmlrpc php56w-mhash libmcrypt php56w-bcmath
yum install -y php56w-fpm
vi /etc/php-fpm.d/www.conf

user = nginx        //默认为apache,修改与nginx一致的用户  需要安装nginx后才能改
group = nginx      //默认为apache,修改与nginx一致的组  需要安装nginx后才能改
vi /etc/php.ini
session.save_path = "/var/lib/php/session"   //设置session的位置,否则PHP运行会出错
chmod 777  /var/lib/php/session     //设置文件夹属性
chkconfig php-fpm on

6.5、安装 REDIS 及 REDIS-php 服务

yum install -y tcl   //若不安装tcl,在make test时会出现错误
cd /usr/local/src
wget http://download.redis.io/releases/redis-4.0.9.tar.gz   //下载redis安装包
tar zxvf redis-4.0.9.tar.gz     //解压
cd redis-4.0.9   //进入redis安装文件夹中,该文件为二进制文件,可直接make操作。
make distclean      //清理旧的一些编译过的文件
make
make test
make PREFIX=/opt/redis USE_TCMALLOC=yes install
mkdir -p /opt/redis/etc
mkdir -p /opt/redis/run
mkdir -p /opt/redis/data/6379
mkdir -p /opt/redis/log
cp redis.conf /opt/redis/etc/redis.conf
cp /opt/redis/etc/redis.conf /opt/redis/etc/redis_6379.conf
创建自动启动脚本
touch /etc/init.d/redis
vi /etc/init.d/redis

段落引用内容如下:

#!/bin/sh
#chkconfig: 2345 80 90 
# Simple Redis init.d script conceived to work on Linux systems 
# as it does use of the /proc filesystem. 

PATH="/opt/redis/bin:$PATH"
EXEC="/opt/redis/bin/redis-server"
CLIEXEC="/opt/redis/bin/redis-cli"
PIDFILE="/opt/redis/run/redis_6379.pid"
CONF="/opt/redis/etc/redis_6379.conf"
PORT="6379"
 
case "$1" in
    start)
        if [ -f $$PIDFILE ]
        then
                echo "$PIDFILE exists, process is already running or crashed."
        else
                echo "Starting Redis server..."
                $EXEC $CONF
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running."
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $CLIEXEC -p $PORT shutdown
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped."
        fi
        ;;
    restart)
        $0 stop && $0 start
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}" >&2
        exit 1
        ;;
esac

赋予运行权限

 chmod +x /etc/init.d/redis
修改时区
vi /etc/php.ini

date.timezone = Asia/Shanghai
修改redis配置
cp -r src/redis-* /opt/redis/
cd /opt/redis/
./redis-server etc/redis.conf 
vi /opt/redis/etc/redis.conf 

daemonize no   ==>   daemonize yes
安装phpredis
cd /root/software
git clone https://github.com/phpredis/phpredis.git
cd phpredis
phpize
./configure --with-php-config=php-config
make
make test
make install
让PHP支持调用redis
vi /etc/php.ini

在最后面增加以下内容

[redis]
extension = /usr/lib64/php/modules/redis.so

添加到自动启动项中

chkconfig --add redis    //开机自启动

6.6、YAF编译安装

cd /root/software
wget http://pecl.php.net/get/yaf-2.3.5.tgz    //需与PHP(5.6)版本匹配
tar zxvf yaf-2.3.5.tgz
安装yaf
cd yaf-2.3.5
phpize
./configure --with-php-config=/usr/bin/php-config
make
make test
make install
让PHP支持调用Yaf
vi /etc/php.ini

在最后面增加以下内容

[Yaf]
extension=/usr/lib64/php/modules/yaf.so
yaf.use_namespace = 1
yaf.environ = "develop"
测试是否成功
php -i | grep yaf

出现下面这些内容,说明安装成功

yaf
yaf support => enabled
Supports => http://pecl.php.net/package/yaf
yaf.action_prefer => Off => Off
yaf.cache_config => Off => Off
yaf.environ => develop => develop
yaf.forward_limit => 5 => 5
yaf.library => no value => no value
yaf.lowcase_path => Off => Off
yaf.name_separator => no value => no value
yaf.name_suffix => On => On
yaf.st_compatible => Off => Off
yaf.use_namespace => On => On
yaf.use_spl_autoload => Off => Off

后续文章

CentOS+Nginx+Tomcat+Mysql+PHP 配置篇(2)

CentOS+Nginx+Tomcat+Mysql+PHP 配置篇(3)