腾讯云CVM的CentOS系统中部署nodejs

登录腾讯云主机

  • Windows平台
    下载PuTTY客户端,使用提供的公网ip和默认的用户名密码登录。
腾讯云CVM的CentOS系统中部署nodejs_第1张图片
PuTTY Login.png
  • Linux或者Mac OS
    在终端中输入ssh [email protected],其中xxx.xxx.xxx.xxx代表你的公网IP,然后输入默认用户名密码。可能会碰到如图所示的连接不可信的情况,按提示输入。
    SSH Warning.png

修改默认登录密码

输入passwd会提示输入新密码和确认新密码,按要求即可。

Modify Password.png

创建新用户

使用 useradd wudi添加用户名,然后使用passwd wudi 给新添加的用户设置密码,设置密码时可能会提示你设置的密码过简单,忽略就行了。

跟用户相关的系统文件主要有:

  • /etc/passwd 用户列表。
  • /etc/group 用户组列表。

我们使用cut -d : -f 1 /etc/passwd查看所有的用户名,cut命令使用指定的分隔符和域来来从文件中的每行提取出数据,并在控制台中显示。-d :代表使用冒号进行分隔, -f 1 提取第一个域中的数据。
使用vim /etc/sudoers在下图所在处下方添加USER_NAME ALL=(ALL) ALL来为我们新增的用户超级用户权限。

add_root_ privilege.png

以下是一些常用用户组用户命令

userdel USER_NAME删除指定用户。
usermod -d HOME_DIRECTORY -G GROUP_NAME USER_NAME为指定用户设置登目录并将其加入到指定的用户组中。

groupmod -n NEW_GROUP_NAME OLD_GROUP_NAME重命名group。
gpasswd -a USER_NAME GROUP_NAME将用户添加到指定的用户组。
gpasswd -d USER_NAME GROUP_NAME将用户从指定的用户组删除。
groupdel GROUP_NAME删除指定group。
groups USER_NAME查看指定用户名所在的group,如果省略用户名则默认为当前用户名。

w who查看当前登录用户。
whoami查看当前用户名。
id USER_NAME查看指定用户信息。

安装nginx服务器

安装软件我们都用root用户。

更新CentOS默认安装的软件

su #切换为root用户
yum update

安装常用的软件

yum install lynx #文本网页浏览器
yum install wget # 文件下载器(默认安装了)

下载nginx源代码

wget http://nginx.org/download/nginx-1.13.3.tar.gz
#解压文件 z代表使用gzip解压 no-same-owner代表解压出来的文件所有者是当前用户 x代表从压缩文件中释放文件 v代表显示解压过程 f后接解压文件名。
tar --no-same-owner -zxvf nginx-1.13.3.tar.gz 
#查看指定文件夹内的详细内容 a代表显示所有文件 l代表显示详细信息
#第一列表示文件类型和权限,共十位。例如"-rwxr-xr-x",左边第一位表示文件类型,可选值有 -(普通文件)d(块特殊文件)c(字符特殊文件)l(符号链接文件)p(命名管道文件)s(套接字文件);左边第二到四位表示所有者权限;左边第五到七位表示同组其他用户权限;昨天八到十位表示其他用户权限。r代表可读 w代表可写 x代表可执行。
ls -al nginx-1.13.3

安装编译构建工具

因为我们要从源代码中编译nginx,所以需要gcc编译器和make工具。

#查看所有的安装包,每个安装包中有多个软件
yum group list
#安装构建工具
yum group install "Development Tools" --assumeyes
#查看gcc版本
gcc --version
#查看make版本
make --version

安装nginx依赖的包

在接下来安装的依赖包中,我们会成对安装类似于PACKAGE_NAME PACKAGE_NAME-devel这样的依赖包,其中PACKAGE_NAME就是指你将要安装的依赖包。它们之间的区别在于不带-devel后缀的提供其他软件在运行时所需要的动态链接库;而带-devel后缀的提供相应的头文件、动态链接库、静态链接库。

查询已安装的包相关信息方式
  1. 查询已安装的包yum list installed 或者rpm -qa
  2. 查询指定已安装包的信息yum info installed PACKAGE_NAME 或者rpm -qi PACKAGE_NAME
  3. 查询指定已安装包相关安装的文件rpm -ql PACKAGE_NAME
shell中的变量
  1. shell局部变量
    该变量仅在当前shell可用,在shell启动的程序中是不可用的。
    使用VAR_NAME=VAR_VALUE 或者declare VAR_NAME=VAR_VALUE形式定义。
  2. 用户环境变量
    所有程序,包括shell启动的程序和当前shell都能访问的环境变量。
    使用export VAR_NAME=VAR_VALUE形式定义。
  3. 查询shell变量
    env命令打印当前用户的环境变量;export 命令显示导出成当前用户环境变量的shell变量。
  4. source命令
    source.是等效的,作用是在当前shell环境中读取并执行指定文件中的命令。执行source ./COMMAND./COMMAND的区别是后者是启动一个子shell来执行命令。
    常用的场景是我们修改~/.bashrc文件后,通过source ~/.bashrc来让设置立即生效。
  5. 全局设置CentOS环境变量
    我们可以根据需要,修改下面的四个文件,然后使用source命令来让修改立马生效,或者重新登录用户,或者重新打开shell。
  • /etc/profile
    为系统每个用户设置环境变量,当用户登录时该文件被读取执行一次。
  • /etc/bashrc
    对于系统每个用户,当shell被打开时该文件会被读取执行一次。
  • ~/.bash_profile
    为特定用户设置环境变量,当该用户登录时读取执行一次该文件。
  • ~/.bashrc
    特定用户打开shell时该文件会被读取执行一次。
  1. 其他内容
  • 执行单个命令前设置一次性环境变量参考1 参考2。
  • 一次性环境变量只生效一次的原因参考 。
程序使用的动态链接库
  1. 打印使用到的动态链接库
    ldd COMMAND会打印出程序运行时所需的动态链接库及其地址,例如ldd /usr/bin/openssl
  2. 打印加载动态链接库过程
    LD_DEBUG=libs COMMAND会打印出程序运行时尝试查找动态链接库所在目录的过程,例如LD_DEBUG=libs openssl version。其中LD_DEBUG是glibc中的loader为了方便调试而设置的一个环境变量,通过设置这个环境变量,我们可以看到加载过程,更多的该环境变量可选值我们可以通过LD_DEBUG=help ls查看。
  3. 添加新的或者丢失的动态链接库
  • 方法1: LD_LIBRARY_PATH=YOUR_LIB_PATH设置LD_LIBRARY_PATH环境变量。
  • 方法2: 因为链接器会到/etc/ld.so.conf.d目录下寻找配置文件,我们可以在该目录下专门为新添加的动态链接库创建配置文件,将目录添加到该文件内,然后运行ldconfig命令进行更新。例如
    cd /etc/ld.so.conf.d
    echo "YOUR_LIB_PATH" > YOU_LIB.conf
    ldconfig
  • 方法3: 我们可以在标准的动态链接库查找路径中,创建一个符号连接到我们添加的动态链接库文件。例如
    ln -s local/LIB.so /usr/lib/LIB.so
升级系统的openssl

在CentOS中是自带openssl的,但是版本较低,低版本存在漏洞和风险,所以我们用最新的源代码来安装。因为源码编译依赖于zlib,所以之前要安装zlib,安装zlib可以查看之后的操作指南.
有关openssl的常用使用方式可以参考我的这篇文章。

#获取openssl最新的源代码
wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz

#解压源文件
tar --no-same-owner -zxvf openssl-1.1.0f.tar.gz

#进入openssl源码文件
cd openssl-1.1.0f

#配置编译选项 shared代表生成动态链接库; zlib代表使用静态zlib库; prefix代表 include lib的目录; openssldir代表bin certs misc等目录 ;enable-ec_nistp_64_gcc_128激活常用椭圆曲线优化,默认是关闭的,依赖于编译器特征,无法自动检测。
./config shared zlib --prefx=/root/software/openssl --openssldir=/root/software/openssl enable-ec_nistp_64_gcc_128

#编译安装opens s l
make depend
make
make install

#为openssl的动态链接库添加配置文件,以便系统能够找到。
cd /etc/ld.so.conf.d
echo "/root/software/openssl/lib" > updated-openssl.conf
ldconfig

#移除旧版本的openssl命令
mv /usr/bin/openssl /usr/bin/openssl.old

#添加新版本的openssl命令
ln -s /root/software/openssl/bin/openssl /usr/bin/openssl

#验证openssl 版本号
openssl version

#移除旧版本openssl的头文件,如果存在的话。
mv /usr/include/openssl /usr/include/openssl.old

#添加新版本openssl的头文件
ln -s /root/software/openssl/include/openssl /usr/include/openssl
安装zlib

CentOS系统默认是安装zlib的,nginx使用该依赖包来提高传输速度和降低带宽占用,我们可以通过命令rpm -qa | grep zlib查看,如果没有使用以下命令安装。

yum install zlib
yum install zlib-devel
安装pcre

PCRE是Perl Compatible Regular Expression的简写,ngixn会使用该库来实现正则匹配。一般CentOS已经安装了该依赖包,如果没有安装使用以下方式安装。

#查询是否已安装pcre
rpm -qa | grep pcre
#如果没有安装,使用以下命令安装
yum install pcre
yum install pcre-devel

编译安装nginx

先进入解压出来的nginx源码目录下,使用pwd来查看当前路径。

我们先创建供nginx创建工作进程使用的用户和用户组,命令如下:

#选项r代表创建系统账户,用户的UID小于UID_MIN,这种用户专门给services和daemons使用的,没有工作目录,没有密码,不能远程系统。
groupadd -r nginx_group
useradd -r nginx_user -g nginx_group

在源代码目录下有个脚本名称为:configure,我们使用这个脚本来设置变异选项,可以使用./configure --help查看所有可用的选项。
因为配置的选项比较多,我们这里可以使用命令vim nginx_configure_script创建一个脚本并使用命令chmod u+x nginx_configure_script来赋予脚本执行权限,方便以后修改和复用,脚本的内容如下:

#源代码目录
export BUILD_DIR=/root/source_files/nginx-1.1.3
#nginx安装目录
export NGINX_DIR=/root/software/nginx
#nginx命令安装目录
export SBIN_DIR=/usr/sbin
export PID_DIR=/var/run
export LOCK_DIR=/var/run
export LOG_DIR=/var/log/nginx
export RUN_DIR=/var/run
export CACHE_DIR=/var/cache
#因为我们使用最新的源代码编译了openssl,所以在编译nginx时指定新的openssl源代码编译
export OPENSSL_SOURCE_DIR=/root/source_files/openssl-1.1.0f

cd ${BUILD_DIR}
./configure \
--prefix=${NGINX_DIR} \
--sbin-path=${SBIN_DIR} \
--conf-path=${NGINX_DIR}/nginx.conf \
--pid-path=${PID_DIR}/nginx.pid \
--lock-path=${LOCK_DIR}/nginx.lock \
--error-log-path=${LOG_DIR}/error.log \
--http-log-path=${LOG_DIR}/access.log \
--http-client-body-temp-path=${CACHE_DIR}/client_body_temp \
--http-fastcgi-temp-path=${CACHE_DIR}/fastcgi_temp \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-openssl=${OPENSSL_SOURCE_DIR} \
--with-pcre \
--with-file-aio \
--with-http_realip_module \
--user=nginx_user \
--group=nginx_group

创建好脚本后就可以使用以下命令来配置和安装nginx。

#我们创建好的配置脚本
./nginx_configure_script
make 
make install
#安装完成后查看结果
nginx -V

从源代码编译nginx是不带有开机自动启动脚本的,我们可以通过访问https://goo.gl/3XufgG 获取。

使用如下命令来让nginx开机自动启动。

#下载脚本
wget -O /etc/init.d/nginx https://gist.githubusercontent.com/sairam/5892520/raw/b8195a71e944d46271c8a49f2717f70bcd04bf1a/etc-init.d-nginx

#打开脚本,修改nginx配置文件目录
vim /etc/init.d/nginx

#修改NGINX_CONF_FILE="/root/software/nginx/nginx.conf"

#添加执行权限
chmod +x /etc/init.d/nginx

#增加nginx系统服务
chkconfig --add nginx

#指定在3 4 5执行登记开启
chkconfig --level 345 nginx on

#验证是否添加成功
service nginx start

我们可以使用lynx http://localhost来确认nginx服务器是否可以正常访问,如果不出意外,我们会得到一个403页面,因为在默认的配置中,我们是没有权限访问/root/software/nginx/html/index.html文件的。该文件位于root用户的主目录,本来就不是存储web文件的地方,所以我们需要将网站根目录设置到我们为nginx配置的用户的主目录中,也就是nginx_user的主目录。按照一下命令来执行。

#为用户创建主目录,因为我们创建的是系统用户,默认是没有主目录的
mkdir /home/nginx_user

#拷贝一份nginx默认提供的网站文件
cp -R  /root/software/nginx/html /home/nginx_user

#将文件夹及以内的文件夹文件的用户和用户组切换为我们为nginx配置的。
chown -R nginx_user:nginx_group /home/nginx_user/html

# 将网站根目录切换为新创建的目录
vim /root/software/nginx/nginx.conf
#将root修改为 /home/nginx_user/html

#测试配置文件是否正确
nginx -t

#重新加载nginx配置文件
service nginx reload

再访问一下刚才的地址,就能正常访问默认页面了。默认情况CentOS是没有开启80端口的,但是在我们申请的腾讯云中是开启的,所以不需要额外的设置,如果未开启,使用以下命令开启。

#开启80端口
firewall-cmd --permanent --ad-port=80/tcp
firewall-cmd --reload

安装nodejs

首先将用户从root切换到我们自己创建的用户,因为nodejs版本较多,所以我们使用nvm来管理多个版本的nodejs。

#运行nvm提供的安装脚本
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash

#安装完成后需要重新加载~/.bashrc文件
source ~/.bashrc

#检查nvm版本号,来确认是否安装成功
nvm --version

安装完nvm后,我们就可以借用nvm来安装特定版本的nodejs了。

#查看可安装的版本
nvm ls-remote

#安装指定的版本
nvm install v8.3.0

#查询已安装的nodejs版本
nvm list

#指定当前使用的nodejs版本
nvm use v8.3.0

#查看nodejs版本号
node -v

安装完nodejs后我们创建一个简单的demo应用程序来验证功能。

  • 安装必要依赖包
#创建demo文件夹
mkdir demo
cd demo

#初始化package.json文件
npm init

#安装依赖
npm install express body-parser morgan rotating-file-stream --save
  • 简单的nodejs服务器server.js,以下是对应的文件内容
var express = require("express");
var bodyParser = require("body-parser");
var morgan = require("morgan");
var path = require("path");
var fs = require("fs");
var rotating = require("rotating-file-stream");

var app = express();
var logDir = path.join(__dirname, "log");

//ensure log dir
fs.existsSync(logDir) || fs.mkdirSync(logDir);

var logStream = rotating("access.log", {
    interval: "1d",
    path: logDir
});
//应用express中间件
app.use(morgan("combined", {stream: logStream}));
app.use(bodyParser.json({limit: "50mb"}));
app.use(bodyParser.urlencoded({limit: "50mb", extended: true}));

app.get("/", function(req, res) {
    res.send("Hello  Nodejs Server!");
});
//创建仅在本地能访问的服务器
app.listen(3000, "localhost", function(error) {
    if (error) {
        console.log("Listen localhost:3000 error!");
        return;       
    }
    console.log("Listen localhost:3000 successfully!");
});

安装pm2

PM2是具有内置负载均衡的生产进程管理器,可用来管理nodejs应用,可以保证应用程序持续运行和无间隙重新加载。

#安装pm2
npm install pm2 -g

#使用pm2启动nodejs服务器,可用--name指定一个新的名字
pm2 start server.js

#令nodejs服务器开机启动,根据打印出来的提示执行指定的命令
pm2 startup

#保存进程列表供重启使用
pm2 save

#查询所有的进程
pm2 list

#重启指定的进程
pm2 restart server

#停止指定进程
pm2 stop server

为nodejs配置nginx http反向代理

为了方便更改配置,我们按照如下命令新建一个nginx配置文件,其中nginx_user目录是运行nginx时指定的用户的主目录:

cd /home/nginx_user    
mkdir /home/nginx_user/conf.d
vim demo_3000.conf    

并向该文件内输入以下内容:

upstream demo_3000 {
    server 127.0.0.1:3000;
    keepalive 64;
}

server {
    listen 80;
    server_name localhost;

    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_pass http://demo_3000;//前面定义的upstream
        proxy_cache_bypass $http_upgrade;
    }
}

打开/root/software/nginx/nginx.conf文件,并在http块中输入以下内容,因为默认配置文件中配置了80端口,我们可以把其注释掉或者更改下端口。

include /home/nginx_user/conf.d/*.conf;

测试配置文件,重新加载nginx配置文件:

#测试更改的配置文件
nginx -t

#重新加载nginx配置文件
service nginx reload

为nodejs配置nginx https反向代理

在上一步配置http反向代理的基础之上,我们在/home/nginx_user/conf.d文件夹内新创建一个配置文件来设置https反向代理,内容如下:

upstream https_demo_3000 {
    server 127.0.0.1:3000;
    keepalive 64;
}

server {
    listen 443;
    server_name localhost;

    ssl_password_file /home/nginx_user/private/password;#私钥的保护密码
    ssl_certificate /home/nginx_user/private/web.crt;#自签名证书
    ssl_certificate_key /home/nginx_user/private/private.key;#私钥

    ssl on;
    ssl_session_cache shared:SSL:10m;#共享的ssl会话缓存,10m大约40000个会话
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;#加密协议版本
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;#指定加密套件
    ssl_prefer_server_ciphers on;#优先使用服务器加密套件

    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_pass http://https_demo_3000;#上方定义的upstream
        proxy_cache_bypass $http_upgrade;
    }
}

测试配置文件,重新加载nginx配置文件:

#测试更改的配置文件
nginx -t

#重新加载nginx配置文件
service nginx reload

结尾

部署完成后你就可以使用你喜欢的nodejs后端框架(express、koa...)和前端框架(angular、react、vue...)开发功能,如果上面内容有任何不当之处,还望指正,共同进步。

参考

  • Nginx From Beginner to Pro

你可能感兴趣的:(腾讯云CVM的CentOS系统中部署nodejs)