1.前言
这是一个生产环境d的经验分享,也可以当操作指南。记录从全新的linux到业务部署上线的过程,涵盖基本的安装、常用的性能调优配置、安全配置、运维监控等,单机单节点。
1.1 环境信息
系统版本:Linux Centos 7.3
服务器架构:Nginx + Node / PHP + Mongodb/Mysql + Redis
1.2 安装列表
文章中涉及的所有软件的清单
#业务软件
nginx git mysql php php-fpm mongodb nodejs
#系统软件
unzip pm2 wget iptools iptable ipset firewalld netdata
2 安装步骤
在centos系统安装环境,最快也最方便的选择当然是大部分软件都用yum搞定,可以理解为Centos系统的软件包管理器、应用市场。有了他,就不用大小软件都下源码、编译、配环境变量,中间的各种依赖、编译先后顺序简直让人头大。
- yum的安装 :Centos系统自带
- yum源的更新:步骤很简单,下最新的源地址+清缓存+update+耐心等待... 详见参考
- 添加 EPEL仓库
yum install epel-release
2.1 Nginx
- 使用
yum search nginx
检查yum是有已有nginx源
添加nginx 源地址
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
- 安装
yum install nginx -y
- 启动
service nginx start
或nginx
关闭/重启service nginx stop/restart
或nginx -s stop
测试配置nginx -t
- 默认nginx安装路径在
/etc/nginx
,配置文件目录/etc/nginx/nginx.conf
- 生产环境中,一般需要对nginx进行参数调优、反向代理配置、https配置、安全性配置等,结合自己需求去配置就好,见3.1相关参考
2.2 Git
- 使用yum直接安装
yum install git -y
2.3 mysql客户端与服务端
虽然叫mysql,但其实人家早已改名为mariadb
sudo yum install mariadb-server mariadb
- 启动mysql服务:
mysqld_safe &
(&结尾为后台执行的意思) - 设置root用户密码:
mysqladmin -u root password "xxxx"
- 链接mysql:
mysql -u xxx -p
- 开启远程访问:
进入mysql数据库
grant all privileges on *.* to 'root'@'%' identified by 'password';
flush privileges;
修改my.cnf配置文件,去掉bind-address
重启服务器
如果有防火墙,需要开启数据库端口的TCP链接,默认3306
如:iptables -A INPUT -p tcp -s 0/0 --dport 3306 -j ACCEPT
firewall-cmd --permanent --add-port=3306/tcp
参考:
- Linux下远程连接MySQL数据库
- MySQL 5.7 my.cnf配置文件说明
- Linux下MySQL报错:Can't open the mysql.plugin table. Please run mysql_upgrade to create it
2.4 PHP
如果采用nginx+php+mysql的方式,没有xampp集成环境方便,需要一个个安装,如果代码对php、mysql版本有要求的,注意安装时的版本号。
yum install php php-mysql php-fpm php-mbstring php-gd -y
这里php-fpm是php的进程管理器,是php代码真正执行的环境,nginx只是将请求反向代理过去。原理及配置参考
如果需要其他php模块,可以自己用yum查找安装。
参考: php模块安装 php版本切换 php-fpm性能调优
- 启动php-fpm
service php-fpm start
- 查看php安装了哪些模块
php -m
- 默认php配置文件路径
/etc/php.ini
- 默认php-fpm配置文件路径
/etc/php-fpm.conf
- 参考文档:php-fpm配置说明
2.5 MongoDB
因为yum里的mongodb版本太老,这里直接下载安装mongo官网的最新社区版,新的4+版本担心兼容性,这里就选择3.6了
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.10.tgz
解压之: tar -xzvf mongodb-linux-x86_64-3.6.10.tgz
查看bin路径,并添加进用户的PATH环境变量中,这里修改环境变量的方法就不讲了,不会的自行google
cd mongodb-linux-x86_64-3.6.10/bin ; pwd
- 启动mongodb:创建数据库路径,默认
/data/db
,启动:mongod
.真正使用都会以配置文件启动mongod -f mongodb.conf
,修改外网链接条件、后台运行等等配置,详细参考
2.6 Nodejs
这里直接下载官网的nodejs linux平台二进制包
wget https://nodejs.org/dist/v10.15.1/node-v10.15.1-linux-x64.tar.xz
解压:xz -d node-v10.15.1-linux-x64.tar.xz;
tar -xvf node-v10.15.1-linux-x64.tar;
与Mongo类似,将bin目录添加进用户PATH中。
2.7 Redis
- 安装与启动:
yum install redis -y; redis-server redis.conf
- redis后台启动:
修改redis.conf 中daemonize 为yes
3 配置与启动
大部分软件的默认配置都只满足基础应用,对性能、安全等有需求时都需要弄懂他们的配置文件,并进行相应修改。下面记录我们业务中用到的调优配置,目前8核16G的机器,支撑每日8千万以上PV+ddos攻击广告业务,平均响应市场100ms以内,峰值并发2w左右。
3.1 Nginx配置与启动
nginx主要需要配置性能调优的设置,和反向代理到php-fpm或者nodejs程序的配置,还有https等
3.1.1性能调优
直接上参考文档,自己也是学的别人的经验
nginx - 性能优化,突破十万并发
Nginx性能调优
nginx下php-fpm的配置文件调整优化解决方案
我个人的总结就是,主要需要优化的有:
1.系统内核对TCP连接数、文件打开数等的限制
2.Nginx的进程协同模式、最大请求数、一些超时时间、静态缓存配置等
3.php-fpm的进程数、工作模式、处理请求数、打开文件数等限制
3.1.2反向代理
反向代理是nginx最强大和实用的地方之一,个人理解就是用一个接入点,将TCP请求按规则分发给其他后端服务或网络节点的能力,大家可以自行google学习理解。这部分不难,更多是结合实际去操作、理解,解决实际的系统需求。
- 创建反向代理的配置文件
touch /etc/nginx/reverse-proxy.conf
- 编辑反向代理至php-fpm
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name *.你的域名.com ;
#你的php代码根路径
root /var/www/html/xxxx;
index index.html index.php index.htm;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
# set expiration of assets to MAX for caching
location ~* \.(ico|css|js|gif|jpe?g|png|ogg|ogv|svg|svgz|eot|otf|woff)(\?.+)?$ {
expires max;
log_not_found off;
}
# framework rewrite
location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}
location ~* \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
include fastcgi_params;
#修改成你自己的代码路径
fastcgi_param SCRIPT_FILENAME /var/www/html/advert/htdocs/$fastcgi_script_name;
try_files $uri $uri/ /index.php?q=$uri&$args;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
- 引入反向代理配置
在nginx的配置文件的http模块添加:include /etc/nginx/reverse-proxy.conf; #反向代理配置
- 使用
nginx -t
测试配置是否有错,使用service nginx restart
重启nginx服务器 - 将php代码放在对应路径下就能访问到了
- 代理后后端Node程序的配置更简单一些,网上很容易找到,注意如果需要拿到客户端ip的话,将remote_ip的http头特殊处理下就好
- 可以用nginx搭建静态服务器、屏蔽一些特殊的地址、屏蔽特殊请求等等
3.1.3 Https链接
- 申请好证书后按教程一配就好,很简单,不写了
3.2 防火墙
目前的网络环境,业务上线肯定不能裸奔的,太容易被攻击,我们业务上线后,就遭遇了DDOS攻击和持续的漏洞扫描,防火墙与业务安全、容灾、性能都是上线后重点需要关注的点。
linux防火墙以iptable和firewall两个为主,如果是云服务,厂商的控制台也会再提供一层防火墙。
以我们的业务为例,物理机,用iptable,公网只开启80、22、443端口,专门写了一个自动处理nginx链接日志,识别疑似攻击的ip的程序,用iptable + ipset进行自动批量拉黑,每天都能拉黑3w个左右的攻击或机房ip。
常用命令
#firewall-cmd开放端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload
#iptable 显示所有规则
iptables -nL
#iptable 添加端口
iptables -A INPUT -p tcp -s 0/0 --dport 80 -j ACCEPT
#iptable 封ip
iptables -I INPUT -s ***.***.***.*** -j DROP
#ipset 创建集合
ipset create banlist hash:net
#ipset 添加ip
ipset add banlist 203.171.228.159
#iptable 添加ipset集合进黑名单
iptables -I INPUT -m set --match-set banlist src -p tcp --destination-port 80 -j DROP
#ipset 查看
ipset list banlist
#ipset 查看ip数
ipset list banlist |wc -l
参考文档:
- 关于 iptables 和 firewalld 的那些事
- inux iptables常用命令之配置生产环境iptables及优化
- 利用iptables和ipset屏蔽恶意IP的访问
- 如何在 Linux 下大量屏蔽恶意 IP 地址
- CentOS7下关闭默认防火墙启用iptables防火墙
3.3 运维监控
装好了软件,配置好了环境,其实你的业务就已经可以开始正常运作了,只是在过程中难免会出问题,这时候就需要一套监控程序随时监控你的服务器状态、业务状态等,这些其实都是运维的职责,不过小公司小团队就都得技术负责人一肩挑了,比如我。。。
3.3.1 云平台
如果你是用的xx云,那么你基本不用做什么,服务商会给你提供从cpu到网络的全方位监控,也有很多如告警、巡检、业务监控等服务。本人资深阿里云用户,后面准备补一篇阿里云使用的经验总结。
3.3.2 物理机
如果是物理机,那就得自己建设了,总不能一直连着服务器看top。这里推荐netdata,功能全面,性能优秀,界面炫酷,界面炫酷,界面炫酷。
Linux服务器监控的神器:Netdata
3 结语
至此,linux环境的基础软件,服务器的基础软件与运行环境,以及安全、性能和运维监控所需的处理,就都已完成。一定是满足初创项目或企业要求的,如有不足欢迎指出~
本篇的记录都是以单服务器单节点作为样例,更优的架构应该是将数据库、业务服务器、接入服务器(负载均衡服务器)全部分离,考虑业务的备份容灾、平滑升级、横向扩容、节点同步等等需求,目前没有这方面的需求和实战经验,业务发展到了一定规模,就一定要在系统架构层面保证稳定性、安全性了。
另外,也可以把搭建好的这种环境,制作成docker镜像,这样再次安装新环境时也会省心省力。
网友评论