【整合篇】CENTOS7下配置nginx与nodejs(yum安装)
Centos7最小安装后添加nginx 1.13.2
及nodejs 8.0.0
,配置WEB服务器运行,并设置开机自行启动服务。
搭建期间遇到的系列问题:nginx站点proxy502和403错误、nginx配置错误无法开启、nginx启动成功但访问出错、node服务开机自启动。
如果不是用ROOT用户登录,操作指令前务必输入sudo获取root权限!
本文目的:配置最小系统的CENTOS7下nginx+node环境,并在nginx下设置反向代理,实现node站点运行。
一.准备工作
查看网络连接
如果用virtualbox等虚拟机安装,需将网络连接修改为:桥接网卡
,高级-混杂模式-允许虚拟电脑
。
[root@nooldey]# cd /etc/sysconfig/network-scripts/ |
重启网络成功后显示如下:
安装编译环境
[root@nooldey]# yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel |
【安装包说明】
`gcc gcc-c++`:LINUX系统下的软件安装都是二进制文件在系统本地进行c++编译后安装的,需要本地c++编译环境;
`pcre`:Perl Compatible Regular Expressions正则表达式库;
`zlib zlib-devel`:gzip解压缩工具;
`openssl openssl-devel`:远程ssh登录
至此,以上安装完毕后,就可以在xshell
上开心地用ssh远程连接开始管理了!
二.配置nginx环境
安装nginx
本文采用yum安装方式,另一种方式参考CENTOS7下从零开始配置nginx并开机启动(wget方法)。
最新nginx安装包地址查看:http://nginx.org/packages/centos/7/noarch/RPMS/ 选择release版。
#将nginx加入yum repo库 |
安装前配置时界面:
安装完毕显示界面如下图:
启动nginx
启动nginx前,务必检查下nginx是否安装正常,用指令nginx -v
,如果返回版本信息,则安装正常。
#启动nginx服务 |
成功启动后界面如下:
这时,在外网还是无法连接访问新站点(http://192.168.31.159
),因为防火墙还未关闭,有两种方法,一是放开防火墙的80端口,允许外网访问该端口,二是直接关闭防火墙。
本文,我们采用关闭防火墙(CentOS7的防火墙为firewalld
)的办法,因为后面的测试可能用到其他端口。
#查看防火墙状态 |
关闭防火墙后,再次访问我们的本地站点(http://192.168.31.159
)。
恭喜!成功搭建nginx站点!
然鹅,当我们重启centos后,呜呜,站点无法访问了!
没关系,设置开机自动启动nginx
就搞定了。
#开机启动nginx |
搞定!可爱的nginx欢迎页面又回来了!
三.配置node环境
安装nodejs
这里同样采用yum安装方式,另一种方式参考CENTOS7下安装nodejs(wget方法)。
各个系统nodejs安装方式:https://nodejs.org/en/download/package-manager/
#添加nodejs至yum repo,node8.x竟然还没有出 |
最近网络有点抽风,截图的时候只能装node v7.x系列版本,更新时竟然正常下载安装了node v8.2.0!!
四.配置ftp
参阅本站ftp专题文章:CENTOS7下配置vsftpd。
配置完毕后,ftp上传的默认目录即为我们放置站点的统一路径:/var/www/ROOT
。
五.配置站点
注意事项
采用yum安装和wget下载安装,nginx的目录结构是有区别的
本文对应的nginx主要目录如下。
/usr/share/nginx/html
【默认nginx的站点文件目录】
/etc/nginx/conf.d
【默认nginx的站点配置文件目录】
配置站点nginx.conf
假定站点文件放置路径:/var/www/ROOT
.
设置运行用户为:user nobody
.
1.添加站点配置
[root@nooldey nginx]# cd /etc/nginx/conf.d |
设置站点配置如下:
server { |
2.上传站点文件
通过ftp上传至/var/www/ROOT
目录下即可。
3.配置node站点npm包环境(在站点文件的上级目录下)
[root@nooldey nginx]# cd /var/www |
运行node站点:
[root@nooldey nginx]# nohup node /var/www/ROOT/app.js & |
六.测试站点(nginx站点proxy502和403错误)
兴高采烈地在windows火狐浏览器下打开站点,bong! 大大的502挂页面上!
各种谷歌,奇怪的是,我在另一台虚拟机上安装nginx1.13.2却并未遇到这个问题,猜测是新版本已经修复了这个bug。
#检查nginx状态 |
终于发现一条错误提示:
Jul 21 04:20:51 localhost.localdomain systemd[1]: Failed to read PID from file /var/run/nginx.pid: Invalid argument |
这是因为systemd要求nginx执行前就拥有PID,执行命令:
#解决nginxPID错误 |
为了保证所有用户运行都可以保证web目录可访问:
#a:所有用户 +:增加权限 x:可执行 |
重启再次访问,嗯,不是502错误了~ 是403 Forbidden!!!
这一次,不再猜测权限问题了,因为web目录现在是所有用户都可以读取和执行的!
Stack Overflow告诉我,这可能是SELinux的安全设置问题:
[root@nooldey www]# getenforce |
再次访问站点,我靠!真的能访问了!
把SELinux重新开启,然后赋予nginx运行web目录的权限:
[root@nooldey www]# setenforce Enforcing |
重启node服务,重启nginx,访问站点,ok!
七.骚年,你忘了设置开机自启动服务了!
以上六大部分设置完毕之后,基本上站点运行已经没有其他障碍了,但碎碎念这时候又想到,万一服务器突然抽风宕机了怎么办?
总不能在网站每次宕机之后都人工去一项一项服务地重启吧?
于是乎,就有了这一部分——开机自启动node应用。
在另一篇文章《CENTOS7下安装配置nodejs(wget方法)》中有提到简单的开机自启动node的方法,但那个方法有一个缺陷,必须开机后至少有一次用户登录的行为之后才能启动。
最靠谱的做法是:将node网站启动脚本封装为CentOS的系统服务
。
[root@nooldey ~]# cd /usr/lib/systemd/system/ |
在新建的nodeapp.service文件中填写内容:
/var/www/ROOT/app.js
应对应为你所搭建的node站点的入口文件。
/usr/bin/node
对应为node安装后的执行路径。
如果不确定node路径,可用whereis node
搜寻,并拷贝bin路径。
[Unit] |
启动服务测试是否可以正常访问:
[root@nooldey ~]# systemctl start nodeapp |
咦,正常访问了!那就赶快加入开机自动:
[root@nooldey ~]# systemctl enable nodeapp |