CentOS7 node.js nginx MySQL redis搭建服务器全过程
本文记录在 CentOS7 上从零搭建完整服务器环境的全过程,包括 Node.js 安装、Nginx 反向代理配置、MySQL 数据库部署及 Redis 缓存服务搭建。
yum install git -y
一、安装nodejs
推荐
-
-
修改 下载仓库为淘宝镜像
npm config set registry http://registry.npm.taobao.org/ -
如果要发布自己的镜像需要修改回来
npm config set registry https://registry.npmjs.org/
-
下载
先进入/usr/src文件夹,这个文件夹通常用来存放软件源代码:
cd /usr/local/src/
wget https://nodejs.org/dist/v8.9.4/node-v8.9.4-linux-x64.tar.xz
国内源
wget https://npm.taobao.org/mirrors/node/v8.9.4/node-v8.9.4-linux-x64.tar.xz
版本自己替换
解压
tar -vxf node-v8.9.4-linux-x64.tar.xz
mv node-v8.9.4-linux-x64 node // 移动至/node
配置环境变量
进入 etc 目录下,打开 profile 文件 $ vi /etc/profile 增加以下内容:
export NODE_HOME=/usr/local/src/node
export PATH=$NODE_HOME/bin:$PATH
现在执行查看 node 版本:
$ node -v
v8.9.4 说明环境变量配置成功。
如果关闭终端再进去发现 node 环境变量失效,可以在 ~/.bash_profile 增加 export。
$ vim ~/.bash_profile
在结尾添加以下内容:
export NODE_HOME=/usr/local/src/node
export PATH=$NODE_HOME/bin:$PATH
退出系统,再次进入执行 node -v 和 npm -v,出现版本号则说明没有问题。
错误
-
bash: line 1: 500:: command not found
vi ~/.bash_profile
PATH=$PATH:$HOME/bin:/sbin:/usr/bin:/usr/sbin
source ~/.bash_profile
-
curl: (7) Failed connect to raw.githubusercontent.com:443; Connection refused
1 |
|
二、安装Nginx
HTTP请求是80端口,但是在Linux上非root权限是无法使用1024以下端口的,并且因为安全原因,最好不要使用root权限登录服务器,所以无法直接用node.js程序监听80端口。因此我们需要使用Nginx给node.js做反向代理,将80端口指向应用程序监听的端口(如node.js默认的3000端口)。
添加Nginx仓库
yum install -y epel-release
下载Nginx
yum install -y nginx
启用nginx服务
systemctl start nginx
添加开机启动
systemctl enable nginx
centeros 6 版本没有systemctl
-
启动nginx
whereis 查看nginx目录
whereis nginx
启动
/usr/sbin/nginx -c /etc/nginx/nginx.conf
测试
nginx -t
-
开机自启
查看
chkconfig
设置自启动
chkconfig nginx on
-
nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)
vi /etc/nginx/conf.d/default.conf
#注释
#listen [::]:80 default_server;
修改Nginx配置文件
vim /etc/nginx/nginx.conf //使用lnpm意见安装,Nginx 目录: /usr/local/nginx/
添加:
server {
listen 80;
server_name host1 host2; #绑定的域名
location /
{
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://127.0.0.1:3000; #对应该的Nodejs程序端口
}
access_log /etc/nginx/logs/host.log; #网站访问日志
}
测试配置文件是否能够正确运行
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# 这样就是配置成功
重启nginx
service nginx restart
现在直接在浏览器中输入我们配置的域名就可以访问我们的项目了。
三、安装MySQL
最新安装MYSQL 8
1 | #安装MYSQL8的yum源 |
查看可用版本
yum list | grep mysql
在centOS 7中不能使用yum -y install mysql mysql-server mysql-devel安装,这样会默认安装mysql的分支mariadb。
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可的MariaDB是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。
正确的安装方法
众所周知,Linux系统自带的repo是不会自动更新每个软件的最新版本(基本都是比较靠后的稳定版),所以无法通过yum方式安装MySQL的高级版本。所以我们需要先安装带有当前可用的mysql5系列社区版资源的rpm包。
用uname -a命令看看自己的平台版本
# 下载
rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
# 查看当前可用资源
yum repolist enabled | grep "mysql.-community."
从上面的列表可以看出, mysql56-community/x86_64 和 MySQL 5.6 Community Server 可以使用。
因此,我们就可以直接用yum方式安装了MySQL5.7版本了。
yum -y install mysql-community-server
MySQL基础配置
systemctl enable mysqld //添加到开机启动
systemctl start mysqld.service //启用进程
systemctl status mysqld.service
mysql -uroot -p //设置密码,默认为空
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';
或者:
[root@centos-linux ~]# mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MySQL to secure it, we'll need the current
password for the root user. If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.
You already have a root password set, so you can safely answer 'n'.
Change the root password? [Y/n] y [设置root用户密码]
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y [删除匿名用户]
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] n [禁止root远程登录]
... skipping.
By default, MySQL comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y [删除test数据库]
- Dropping test database...
ERROR 1008 (HY000) at line 1: Can't drop database 'test'; database doesn't exist
... Failed! Not critical, keep moving...
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y [刷新权限]
... Success!
All done! If you've completed all of the above steps, your MySQL
installation should now be secure.
Thanks for using MySQL!
Cleaning up...
四、开启binlog日志
- 登录mysql之后使用下面的命令查看是否开启binlog
show variables like ‘log_%’;
-
编辑配置文件
vi /etc/my.cnf -
# log bin 后插入server_id=2
log_bin = mysql-bin
binlog_format = ROW
expire_logs_days = 30 -
重启mysql服务
systemctl restart mysqld
五、操作MySQL
配置远程连接
grant all privileges on *.* to 'root'@'%' identified by 'pwd' with grant option; //添加授权的用户
flush privileges; //刷新数据库
// 指定用户访问指定数据库
create user test@'%' identified by 'pwd';
grant all privileges on testdb.* to 'test'@'%' identified by 'pwd';
flush privileges;
检测是否开启3306端口
netstat -tunlp
[root@iZbp18fmanujg9bo2ih5auZ redis]# netstat -tulp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 localhost:6379 0.0.0.0:* LISTEN 15382/redis-server
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN 26363/nginx: master
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN 866/sshd
看到3306端口被开启之后,我们就可以使用本地客户端远程访问数据库了
六、安装Redis
-
如果是新安装的操作系统,要先以管理员身份,升级系统:
sudo yum update -
如果wget没有安装,运行:
yum install wget -
创建Redis目录
mkdir /usr/local/redis
cd /usr/local/redis -
下载Redis,并编译
wget http://download.redis.io/redis-stable.tar.gz
tar xzf redis-stable.tar.gz
cd redis-stable
make
可能问题处理:
-
如果执行make时提示“gcc:命令未找到”,先执行:
yum install gcc -
如果提示:jemalloc/jemalloc.h: 没有那个文件或目录,make的时候加上MALLOC=libc 参数。
make MALLOC=libc -
如果出现“Youneed ‘tclsh8.5’ in order to run theRedis test”。则可运行sudo apt-get install tcl8.5 来安装tcl。
yum install tcl -
不要在界面环境下解压,会造成某些执行文件属性丢失
-
redis警告处理 WARNING Memory overcommit must be enabled; vm.overcommit_memory = 1
vi /etc/sysctl.conf
vm.overcommit_memory = 1
#重启 reboot#或者
sysctl vm.overcommit_memory=1
或
echo 1 > /proc/sys/vm/overcommit_memory#查看修改结果
cat /proc/sys/vm/overcommit_memory
-
Redis程序和配置的整理,方便后期维护
创建目录:
mkdir /usr/local/redis/bin拷贝编译后的执行程序到/usr/local/redis/bin目录下:
cd /usr/local/redis/redis-stable/src
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server redis-trib.rb /usr/local/redis/bin/创建目录:
mkdir /usr/local/redis/etc拷贝配置文件到/usr/local/redis/etc目录下:
cd /usr/local/redis/redis-stable
cp redis.conf /usr/local/redis/etc -
运行服务:
vim /usr/local/redis/etc/redis.conf
daemonize是否以后台进程运行,默认为no,修改为yes执行以下指令,Redis将以非控制台运行:
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf -
查看启动服务
ps -ef | grep redis -
安装测试:
默认IP,127.0.0.1:
/usr/local/redis/bin/redis-cli -a pwd绑定IP :
/redis-cli -h 192.168.218.130 -p 6379 -a pwd测试:
redis> set name hello
OK
redis> get name
“hello” -
停止服务
/usr/local/redis/bin/redis-cli -a pwd
127.0.0.1:6379>shutdown -
Redis.conf说明和示例:
daemonize是否以后台进程运行,默认为no
pidfile如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pid
bind绑定主机IP,默认值为127.0.0.1(注释)
port监听端口,默认为6379
timeout超时时间,默认为300(秒)
loglevel日志记录等级,有4个可选值,debug,verbose(默认值),notice,warning
logfile日志记录方式,默认值为stdout
databases可用数据库数,默认值为16,默认数据库为0
save
指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。 save 900 1 900秒(15分钟)内至少有1个key被改变
save 300 10 300秒(5分钟)内至少有10个key被改变
save 60 10000 60秒内至少有10000个key被改变
rdbcompression 存储至本地数据库时是否压缩数据,默认为yes
dbfilename 本地数据库文件名,默认值为dump.rdb
dir 本地数据库存放路径,默认值为 ./
slaveof
当本机为从服务时,设置主服务的IP及端口(注释) masterauth
当本机为从服务时,设置主服务的连接密码(注释) requirepass 连接密码(注释)
maxclients 最大客户端连接数,默认不限制(注释)
maxmemory
设置最大内存,达到最大内存设置后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,当到达最大内存设置,将无法再进行写入操作。(注释) appendonly 是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认值为no
appendfilename 更新日志文件名,默认值为appendonly.aof(注释)
appendfsync 更新日志条件,共有3个可选值。no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次(默认值)。
vm-enabled 是否使用虚拟内存,默认值为no
vm-swap-file 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
vm-max-memory 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0。
配置示例:
#当dump .rdb 数据库的时候是否压缩数据对象
rdbcompression yes
#dump数据库的数据保存的文件名
dbfilename dump.rdb
#Redis的工作目录
dir/var/lib/redis/###########Replication #####################
#Redis的复制配置
#slaveof
#masterauth##############SECURITY ###########
#requirepass xblx###############LIMITS ##############
#最大客户端连接数
#maxclients 128
#最大内存使用率
#maxmemory##########APPEND ONLYFILE MODE #########
#是否开启日志功能
appendonly no刷新日志到disk的规则
#appendfsync always
appendfsync everysec
#appendfsync no################VIRTUAL MEMORY ###########
#是否开启VM功能
vm-enabled no
#vm-enabled yes
vm-swap-file logs/redis.swap
vm-max-memory 0
vm-page-size 32
vm-pages 134217728
vm-max-threads 4#############ADVANCED CONFIG ###############
glueoutputbuf yes
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
#是否重置Hash表
activerehashing yesRedis官方文档对VM的使用提出了一些建议:
当你的key很小而value很大时,使用VM的效果会比较好.因为这样节约的内存比较大. 当你的key不小时,可以考虑使用一些非常方法将很大的key变成很大的value,比如你可以考虑将key,value组合成一个新的value. 最好使用linux ext3 等对稀疏文件支持比较好的文件系统保存你的swap文件. vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数.如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证。
-
自启动
最好设置密码 redis.conf: requirepass #.123.Redis
添加启动文件vim /etc/init.d/redis, 并修改文件权限chmod +x /etc/init.d/redis
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
# chkconfig: 2345 90 10
# description: Redis is a persistent key-value database
REDISPORT=6379
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli
PIDFILE=/var/run/redis_6379.pid
CONF="/usr/local/redis/etc/redis.conf"
AUTH="#.123.Redis"
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 $REDISPORT -a $AUTH shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
restart|force-reload)
${0} stop
${0} start
;;
*)
echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
exit 1
esac
#设置为开机自启动服务器
chkconfig redis on
#打开服务
service redis start
#关闭服务
service redis stop
重启 reboot
查看是否运行ps -ef | grep redis
vim 常用命令
vim 按esc退出到指令模式,i进入输入模式
指令模式
::q退出;:wq保存退出;:q!强制不保存退出;wq!强制保存退出
/query查询query字符串,回车开始查询;n下一个,N上一个/query\c\c大小写不敏感\C大小写敏感
y复制整行d剪切整行p粘贴

