【整合篇】CENTOS7下配置nginx与nodejs(yum安装)

Centos7最小安装后添加nginx 1.13.2nodejs 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]# ls
#查找列表中ifcfg-enXXX
[root@nooldey]# vi ifcfg-enp0s3
#找到ONBOOT=no修改为ONBOOT=yes
#:wq保存退出编辑
[root@nooldey]# service network restart

重启网络成功后显示如下:
centos-node1

安装编译环境

[root@nooldey]# yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel 
#openssl openssl-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库
[root@nooldey]# rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
#查看nginx信息,包括环境、版本、证书等
[root@nooldey]# yum info nginx
#安装nginx
[root@nooldey]# yum -y install nginx

安装前配置时界面:
centos-node2

安装完毕显示界面如下图:
centos-node3

启动nginx

启动nginx前,务必检查下nginx是否安装正常,用指令nginx -v,如果返回版本信息,则安装正常。

#启动nginx服务
[root@nooldey]# service nginx start
#检查nginx状态
[root@nooldey]# service nginx status

成功启动后界面如下:
centos-node4

这时,在外网还是无法连接访问新站点(http://192.168.31.159),因为防火墙还未关闭,有两种方法,一是放开防火墙的80端口,允许外网访问该端口,二是直接关闭防火墙。

本文,我们采用关闭防火墙(CentOS7的防火墙为firewalld)的办法,因为后面的测试可能用到其他端口。

#查看防火墙状态
[root@nooldey]# service firewalld status
#关闭防火墙
[root@nooldey]# service firewalld stop
#禁止防火墙开机启动
[root@nooldey]# systemctl disable firewalld.service

关闭防火墙后,再次访问我们的本地站点(http://192.168.31.159)。

centos-node5

恭喜!成功搭建nginx站点!

然鹅,当我们重启centos后,呜呜,站点无法访问了!

没关系,设置开机自动启动nginx就搞定了。

#开机启动nginx
[root@nooldey]# systemctl enable nginx.service

搞定!可爱的nginx欢迎页面又回来了!


三.配置node环境

安装nodejs

这里同样采用yum安装方式,另一种方式参考CENTOS7下安装nodejs(wget方法)

各个系统nodejs安装方式:https://nodejs.org/en/download/package-manager/

#添加nodejs至yum repo,node8.x竟然还没有出
[root@nooldey]# curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -
#安装node
[root@nooldey]# yum -y install nodejs

centos-node7

centos-node7

最近网络有点抽风,截图的时候只能装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
[root@nooldey nginx]# vi default.conf

设置站点配置如下:

server {
    listen       80;
    server_name  localhost;
    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;
    location / {
        root   /var/www/ROOT;
        index  index.html index.htm;
        proxy_set_header Host $http_host;
        proxy_set_header x-forwarded-for $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_http_version 1.1;
        proxy_pass http://127.0.0.1:xxxx;
    }
    location /assets/ { 
        root   /var/www/ROOT;
        access_log   off;
        expires      1h;
    }
    error_page  404              /404.html;
    # redirect server error pages to the static page /50x.html
    #
    #error_page   500 502 503 504  /50x.html;
    #location = /50x.html {
    #    root   /usr/share/nginx/html;
    #}
}

2.上传站点文件

通过ftp上传至/var/www/ROOT目录下即可。

3.配置node站点npm包环境(在站点文件的上级目录下)

[root@nooldey nginx]# cd /var/www
[root@nooldey nginx]# npm init
[root@nooldey nginx]# npm install
#根据站点package.json安装所需要的modules
#npm i koa ...

运行node站点:

[root@nooldey nginx]# nohup node /var/www/ROOT/app.js &

六.测试站点(nginx站点proxy502和403错误)

兴高采烈地在windows火狐浏览器下打开站点,bong! 大大的502挂页面上!

各种谷歌,奇怪的是,我在另一台虚拟机上安装nginx1.13.2却并未遇到这个问题,猜测是新版本已经修复了这个bug。

#检查nginx状态
[root@nooldey nginx]# service nginx status -l

终于发现一条错误提示:

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错误
[root@nooldey nginx]# mkdir /etc/systemd/system/nginx.service.d
[root@nooldey nginx]# printf "[Service]\nExecStartPost=/bin/sleep 0.1\n" > /etc/systemd/system/nginx.service.d/override.conf
[root@nooldey nginx]# systemctl daemon-reload

为了保证所有用户运行都可以保证web目录可访问:

#a:所有用户 +:增加权限 x:可执行
[root@nooldey nginx]# chmod -R a+x /var/www
[root@nooldey nginx]# chmod -R a+x /var/www/ROOT

重启再次访问,嗯,不是502错误了~ 是403 Forbidden!!!

这一次,不再猜测权限问题了,因为web目录现在是所有用户都可以读取和执行的!
Stack Overflow告诉我,这可能是SELinux的安全设置问题:

[root@nooldey www]# getenforce
Enforcing
#临时关闭SELinux
[root@nooldey nginx]# setenforce Permissive

再次访问站点,我靠!真的能访问了!

把SELinux重新开启,然后赋予nginx运行web目录的权限:

[root@nooldey www]# setenforce Enforcing
[root@nooldey www]# chcon -Rt httpd_sys_content_t /var/www

重启node服务,重启nginx,访问站点,ok!

七.骚年,你忘了设置开机自启动服务了!

以上六大部分设置完毕之后,基本上站点运行已经没有其他障碍了,但碎碎念这时候又想到,万一服务器突然抽风宕机了怎么办?

总不能在网站每次宕机之后都人工去一项一项服务地重启吧?

于是乎,就有了这一部分——开机自启动node应用。

在另一篇文章《CENTOS7下安装配置nodejs(wget方法)》中有提到简单的开机自启动node的方法,但那个方法有一个缺陷,必须开机后至少有一次用户登录的行为之后才能启动。

最靠谱的做法是:将node网站启动脚本封装为CentOS的系统服务

[root@nooldey ~]# cd /usr/lib/systemd/system/
[root@nooldey ~]# vi /usr/lib/systemd/system/nodeapp.service

在新建的nodeapp.service文件中填写内容:

/var/www/ROOT/app.js应对应为你所搭建的node站点的入口文件。

/usr/bin/node对应为node安装后的执行路径。

如果不确定node路径,可用whereis node搜寻,并拷贝bin路径。

[Unit]  
Description=nodeapp.service
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/bin/setsid /usr/bin/node /var/www/ROOT/app.js
Restart=/bin/pkill node && /bin/setsid /usr/bin/node /var/www/ROOT/app.js  
ExecStop=/bin/pkill node  
ExecReload=
PrivateTmp=true
RemainAfterExit=yes
ExecStartPre=

[Install]
WantedBy=multi-user.target

启动服务测试是否可以正常访问:

[root@nooldey ~]# systemctl start nodeapp

咦,正常访问了!那就赶快加入开机自动:

[root@nooldey ~]# systemctl enable nodeapp
NOOLDEY

本文作者:NOOLDEY

做一个诗情画意的码农,皮皮猪,我们走!

原文链接: http://zhuweisheng.com.cn/tech/centos-nginx-node/

本站文章如无特殊声明均为原创,创作不易,转载请注明来源,谢谢!