登录腾讯云主机
- Windows平台
下载PuTTY客户端,使用提供的公网ip和默认的用户名密码登录。
- Linux或者Mac OS
在终端中输入ssh [email protected]
,其中xxx.xxx.xxx.xxx代表你的公网IP,然后输入默认用户名密码。可能会碰到如图所示的连接不可信的情况,按提示输入。
修改默认登录密码
输入passwd
会提示输入新密码和确认新密码,按要求即可。
创建新用户
使用 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
来为我们新增的用户超级用户权限。
以下是一些常用用户组用户命令
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后缀的提供相应的头文件、动态链接库、静态链接库。
查询已安装的包相关信息方式
- 查询已安装的包
yum list installed
或者rpm -qa
。- 查询指定已安装包的信息
yum info installed PACKAGE_NAME
或者rpm -qi PACKAGE_NAME
。- 查询指定已安装包相关安装的文件
rpm -ql PACKAGE_NAME
。
shell中的变量
- shell局部变量
该变量仅在当前shell可用,在shell启动的程序中是不可用的。
使用VAR_NAME=VAR_VALUE
或者declare VAR_NAME=VAR_VALUE
形式定义。- 用户环境变量
所有程序,包括shell启动的程序和当前shell都能访问的环境变量。
使用export VAR_NAME=VAR_VALUE
形式定义。- 查询shell变量
env
命令打印当前用户的环境变量;export
命令显示导出成当前用户环境变量的shell变量。- source命令
source
和.
是等效的,作用是在当前shell环境中读取并执行指定文件中的命令。执行source ./COMMAND
和./COMMAND
的区别是后者是启动一个子shell来执行命令。
常用的场景是我们修改~/.bashrc文件后,通过source ~/.bashrc
来让设置立即生效。- 全局设置CentOS环境变量
我们可以根据需要,修改下面的四个文件,然后使用source
命令来让修改立马生效,或者重新登录用户,或者重新打开shell。
- /etc/profile
为系统每个用户设置环境变量,当用户登录时该文件被读取执行一次。- /etc/bashrc
对于系统每个用户,当shell被打开时该文件会被读取执行一次。- ~/.bash_profile
为特定用户设置环境变量,当该用户登录时读取执行一次该文件。- ~/.bashrc
特定用户打开shell时该文件会被读取执行一次。
- 其他内容
- 执行单个命令前设置一次性环境变量参考1 参考2。
- 一次性环境变量只生效一次的原因参考 。
程序使用的动态链接库
- 打印使用到的动态链接库
ldd COMMAND
会打印出程序运行时所需的动态链接库及其地址,例如ldd /usr/bin/openssl
。- 打印加载动态链接库过程
LD_DEBUG=libs COMMAND
会打印出程序运行时尝试查找动态链接库所在目录的过程,例如LD_DEBUG=libs openssl version
。其中LD_DEBUG是glibc中的loader为了方便调试而设置的一个环境变量,通过设置这个环境变量,我们可以看到加载过程,更多的该环境变量可选值我们可以通过LD_DEBUG=help ls
查看。- 添加新的或者丢失的动态链接库
- 方法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