Linux服务器部署规范(CentOS 7)

本规范主要用于团队内部服务器部署统一约定,当前使用 CentOS 7 最小化安装 作为模板。

安装

CentOS 7 采用最小化安装,最重要的一步就是磁盘分区规划:

  • 如果尚有磁盘空间,务必采用LVM,方便未来扩容
  • 空间划分要合理,/根分区,/data数据分区,如有必要应划分独立的日志分区 /var

系统检查与初始化

检查CPU/内存/磁盘情况

top
fdisk -l

网络,主机名

借助 nmtui 可以方面的通过一个界面进行网卡、主机名设置

重启网卡依然可以使用 service network restart

SELINUX

关闭SELINUX:

sestatus
vi /etc/sysconfig/selinux

打开文件数限制

查看并修改 (可能需要重启服务器),当作为Webserver时,系统默认1024远远不够。

ulimit -a 

# 最下面增加
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft core unlimited
* hard core unlimited

内核参数调整

主要为TCP一些参数调整,打开文件数限制,swap使用限制,调整需要重启服务器,可与上面两步一起调整。

注意最后两行参数。

net.unix.max_dgram_qlen = 100
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.msgmnb = 4203520
kernel.msgmax = 8192
kernel.msgmni = 256

net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.ip_local_port_range = 20000 65000

net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_mem  =   379008       505344  758016
net.ipv4.tcp_rmem = 4096        87380   4194304
net.ipv4.tcp_wmem = 4096        16384   4194304
net.ipv4.tcp_max_orphans = 3276800

net.ipv4.tcp_max_tw_buckets = 200000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 81920
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.route.max_size = 5242880
net.ipv4.tcp_max_tw_buckets = 200000
net.ipv4.tcp_synack_retries=3

fs.file-max =65536
vm.swappiness = 1

软件防火墙

CentOS 默认为firewall,部署阶段可以关闭软件防火墙,生产环境务必开启(有硬件防火墙除外)

不喜欢 firewall,可以重装回 iptables

systemctl stop firewalld
systemctl disable firewalld

yum -y install system-config-firewall system-config-firewall-tui iptables-services

systemctl start iptables
systemctl enable iptables

system-config-firewall-tui 提供类似 CentOS 6中的 setup 配置 iptables。

系统更新

# 安装必备的工具
yum install net-tools bash-completion wget

# 更新
yum update

# 安装必备的系统工具
yum -y install mlocate screen ntp unzip zip parted rsync tree vim lrzsz tcpdump telnet sysstat lsof strace iptraf iotop hdparm

# 常用开发包
yum -y install gcc gcc-c++ autoconf automake make cmake libevent libtool libXaw expat-devel libxml2-devel libevent-devel asciidoc cyrus-sasl-devel cyrus-sasl-gssapi krb5-devel libtidy libxslt-devel python-devel openssl-devel gmp-devel snappy snappy-devel libcurl libcurl-devel

在这里系统重启一下。

时间同步

先手动同步一次,然后加入到计划任务,每8小时同步一次

ntpdate us.pool.ntp.org
echo "0 */8 * * * /usr/sbin/ntpdate us.pool.ntp.org" >> /var/spool/cron/root

systemctl restart crond

透明大页面

当服务器作为数据库、内存数据库、常驻任务服务器时(Redis、MySQL、Java、Hadoop等),启用透明大页面,它可能会导致重大的性能问题。

当服务器只用于 Webserver(Nginx+PHP),可以忽略。

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

# 同时添加到系统启动脚本中
vi /etc/rc.local

服务器安全配置

避免 SSH 弱口令,修改 SSH 服务端口,修改 SSH 配置文件,将其监听端口更改为大于10000的值:

vi /etc/ssh/sshd_config
Port 22345

修改软件防火墙把默认的22端口改为刚才指定的端口。

关于 SSH 这些配置、端口的修改,一定要在修改后立即进行连接测试,以防由于误操作,断开了当前连接而无法再次连接主机。

禁止root账户远程登录,:

vi /etc/ssh/sshd_config
PermitRootLogin no

添加管理员账户:

# 添加wheel管理员组用户
useradd -g wheel yaoniming
passwd yaoniming

# 限制wheel组用户才能su,去除该行注释
shell> vi /etc/pam.d/su
auth            required        pam_wheel.so use_uid

# wheel组可使用sudo,去除改行注释
vi /etc/sudoers
%wheel  ALL=(ALL)       NOPASSWD: ALL

同样,这里的相关修改以后,一定要立即连接测试

Java 运行环境

安装 JDK 1.8 + Maven 3.5

CentOS 最小化没有自带JDK,不过我们还是检查一下,去官方下载 JDK 以及 Maven

http://www.oracle.com/technetwork/java/javase/downloads/index.html

http://maven.apache.org/download.cgi

# 解压 maven 包到指定路径 /usr/local/server/maven
# 安装 JDK,默认会安装到 /usr/java/
rpm -ivh jdk-8*.rpm

vi /etc/profile

# 添加

export JAVA_HOME=/usr/java/default
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export MAVEN_HOME=/usr/local/server/maven
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin

# 生效
source /etc/profile
java -version
mvn -v

配置

修改Maven本地仓库位置,以及使用aliyun的仓库源:

...
<localRepository>/usr/local/server/maven/repo</localRepository>
...
<mirrors>
    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>central</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/repositories/central</url>
    </mirror>
<mirrors>
...

PHP 运行环境

MySQL

使用官方源安装 MySQL 5.7

rpm -ivh https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm
yum install mysql-community-server

修改配置文件,并启动

vi /et/my.cnf
systemctl enable mysqld
systemctl start mysqld

MySQL 5.7开始默认会生成随机密码

grep 'temporary password' /data/mysql/log/mysql_error.log
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Coowin123.com';

Nginx + PHP

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum install php71w-fpm php71w-opcache php71w-bcmath php71w-cli php71w-devel php71w-gd php71w-mbstring php71w-mcrypt php71w-mysqlnd php71w-tidy php71w-xml php71w-xmlrpc php71w-process php71w-pecl-redis php71w-pecl-mongodb php71w-pecl-imagick php71w-pdo_dblib php71w-pdo

mkdir -p /var/log/server/nginx
mkdir -p /var/log/server/redis
mkdir -p /var/log/server/php
mkdir -p /var/log/server/php-fpm
mkdir -p /var/lib/php/session

Composer

Node & NPM

curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
yum -y install nodejs
npm config set registry https://registry.npm.taobao.org

Python 运行环境

Golang