Menu
快讀
  • 旅遊
  • 生活
    • 美食
    • 寵物
    • 養生
    • 親子
  • 娛樂
    • 動漫
  • 時尚
  • 社會
  • 探索
  • 故事
  • 科技
  • 軍事
  • 国际
快讀

CentOS 7 上安裝 Node.js + PM2 + NGINX + Redis

2020 年 1 月 2 日 多青科技

Firewalld

啓用防火牆服務,除了默認的ssh之外,僅允許http/https連接到服務器。

#!/bin/bash
 
# 啓用firewalld
systemctl enable firewalld
 
# 重啓
(service firewalld status > /dev/null && service firewalld restart) || service firewalld start
 
# 添加支持http和https並重啓
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Letsencrypt

使用Letsencrypt獲得免費的SSL證書 (openssl命令在上次發布的文章有說過)

yum -y install letsencrypt
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

使用Yum Cron

#!/bin/bash
 
# 保證YUM_CRON_EMAIL已設置
if [[ -z $YUM_CRON_EMAIL ]]; then
  echo "You must specify an email using \$YUM_CRON_EMAIL";
else
  # 安裝啓用並加補丁修複
  yum -y install yum-cron patch
  chkconfig yum-cron on
 
  # 配置
  sed -i "s|^email_to = root|email_to = ${YUM_CRON_EMAIL}|" /etc/yum/yum-cron.conf
  sed -i 's|^update_messages = no|update_messages = yes|' /etc/yum/yum-cron.conf
  sed -i 's|^download_updates = no|download_updates = yes|' /etc/yum/yum-cron.conf
  sed -i 's|^apply_updates = no|apply_updates = yes|' /etc/yum/yum-cron.conf
  sed -i 's|^emit_via = stdio|emit_via = email|' /etc/yum/yum-cron.conf
 
  sed -i "s|^email_to = root|email_to = ${YUM_CRON_EMAIL}|" /etc/yum/yum-cron-hourly.conf
  sed -i 's|^update_cmd = default|update_cmd = security|' /etc/yum/yum-cron-hourly.conf
  sed -i 's|^update_messages = no|update_messages = yes|' /etc/yum/yum-cron-hourly.conf
  sed -i 's|^download_updates = no|download_updates = yes|' /etc/yum/yum-cron-hourly.conf
  sed -i 's|^apply_updates = no|apply_updates = yes|' /etc/yum/yum-cron-hourly.conf
  sed -i 's|^emit_via = stdio|emit_via = email|' /etc/yum/yum-cron-hourly.conf   
 
  egrep '^email_to|^update_messages|^download_updates|^apply_updates|^emit_via' /etc/yum/yum-cron.conf
  egrep '^email_to|^update_cmd|^update_messages|^download_updates|^apply_updates|^emit_via' /etc/yum/yum-cron-hourly.conf
   
  # fix bug in yum-cron nightly updates
  if [[ $(grep -q "# success, dependencies resolved" /usr/sbin/yum-cron) -ne 0 ]]; then
    patch /usr/sbin/yum-cron <<PATCHFILE
--- yum-cron.orig 2019-10-23 19:24:57.099859931 +0000
+++ yum-cron  2019-10-23 19:27:58.048784006 +0000
@@ -504,7 +504,13 @@
     except yum.Errors.RepoError, e:
       self.emitCheckFailed("%s" %(e,))
       sys.exit()
-        if res != 2:
+        if res == 0:
+            # success, empty transaction
+            sys.exit(0)
+        elif res == 2:
+            # success, dependencies resolved
+            pass
+        else:
       self.emitCheckFailed("Failed to build transaction: %s" %(str.join("\n", resmsg),))
       sys.exit(1)
PATCHFILE
  fi 
  # (re)start the yum-cron service
  (service yum-cron status > /dev/null && service yum-cron restart) || service yum-cron start
fi

安裝NGINX

使用mainline倉支持HTTP2

#!/bin/bash
 
# import src utility
if [[ -z $(type -t src) ]]; then
  source <(curl -sL https://www.doublesharp.com/src)
fi
 
src osname
src osversion
 
cat <<REPO > /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
# default repo
#baseurl=http://nginx.org/packages/$(osname)/$(osversion)/\$basearch/
# mainline "dev" repo for http2 support
baseurl=http://nginx.org/packages/mainline/$(osname)/$(osversion)/\$basearch/
gpgcheck=0
enabled=1
REPO
 
#install nginx
yum install -y nginx
 
# turn on for reboots
systemctl enable nginx
 
mkdir -p /etc/nginx/includes
mkdir -p /etc/nginx/sites-enabled
mkdir -p /etc/nginx/sites-available
mkdir -p /etc/nginx/streams-enabled
mkdir -p /etc/nginx/streams-available
 
# use a conf file to include our sites-enabled conf files
cat <<SITESENABLED > /etc/nginx/includes/sites-enabled.conf
include                 /etc/nginx/sites-enabled/*.conf;
SITESENABLED
 
[[ -f "/etc/nginx/conf.d/_.sites-enabled.conf" ]] || ln -s /etc/nginx/includes/sites-enabled.conf /etc/nginx/conf.d/_.sites-enabled.conf
 
# enable httpd in selinux
semanage permissive -a httpd_t
 
cat <<NGINX_CONF > /etc/nginx/nginx.conf
user                    nginx;
worker_processes        auto;
 
error_log               /var/log/nginx/error.log warn;
pid                     /var/run/nginx.pid;
 
worker_rlimit_nofile    100000; 
 
events {
  # determines how much clients will be served per worker
  # max clients = worker_connections * worker_processes
  # max clients is also limited by the number of socket connections available on the system (~64k)
  worker_connections      100000;
 
  # optmized to serve many clients with each thread, essential for linux
  use                     epoll;
 
  # accept as many connections as possible, may flood worker connections if set too low
  multi_accept on;
}
 
# web servers / virtual hosts
http {
  include                 /etc/nginx/mime.types;
  default_type            application/octet-stream;
 
  log_format              main    '\$remote_addr - \$remote_user [\$time_local] "\$request" '
                                  '\$status \$body_bytes_sent "\$http_referer" '
                                  '"\$http_user_agent" "\$http_x_forwarded_for"';
 
  access_log              /var/log/nginx/access.log combined flush=1m buffer=128k;
 
  # cache informations about FDs, frequently accessed files
  # can boost performance, but you need to test those values
  open_file_cache         max=200000 inactive=20s;
  open_file_cache_valid   30s;
  open_file_cache_min_uses 2;
  open_file_cache_errors  on;
 
  # send headers in one peace, its better then sending them one by one
  tcp_nopush              on;
   
  # don't buffer data sent, good for small data bursts in real time
  tcp_nodelay             on;
   
  # server will close connection after this time
  keepalive_timeout       30;
   
  # allow the server to close connection on non responding client, this will free up memory
  reset_timedout_connection on;
   
  # request timed out -- default 60
  client_body_timeout     10;
   
  # if client stop responding, free up memory -- default 60
  send_timeout            2;
   
  # reduce the data that needs to be sent over network
  gzip                    on;
  gzip_min_length         10240;
  gzip_proxied            expired no-cache no-store private auth;
  gzip_types              text/plain text/css text/xml text/javascript application/x-javascript application/xml;
  gzip_disable            "MSIE [1-6]\.";
 
  proxy_buffer_size       128k;
  proxy_buffers           64 256k;
  proxy_busy_buffers_size 256k;
  proxy_ignore_client_abort on;
 
  include                 /etc/nginx/conf.d/*.conf;
}
 
# load balancer streams
stream {
  include                 /etc/nginx/streams-enabled/*.conf;
}
NGINX_CONF
 
 
# create a virtual server conf file that is in sites-available
cat <<NGINX_HOST > /etc/nginx/sites-available/myapp.conf
upstream myapp {
        # our app will be on localhost port 3000, but you can change this here
        server                  127.0.0.1:3000 fail_timeout=0;
}
  
server {
        listen                  80;
        server_name             myapp.example.com;
  
        location / {
                proxy_set_header        Host \$host:\$server_port;
                proxy_set_header        X-Real-IP \$remote_addr;
                proxy_set_header        X-Forwarded-For \$proxy_add_x_forwarded_for;
                proxy_set_header        X-Forwarded-Proto \$scheme;
  
                proxy_pass              http://myapp;
        }
}
NGINX_HOST
  
# link this conf to sites-enabled. it's important to use the full path
#ln -s /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled/myapp.conf
 
nginx -t && (service nginx status > /dev/null && service nginx restart)

安裝Redis

安裝Redis之前先安裝EPEL

#!/bin/bash
 
# install the EPEL repo to access Redis
yum install -y epel-release
yum install -y redis
 
# fix redis background saves on low memory
sysctl vm.overcommit_memory=1 && cat <<SYSCTL_MEM > /etc/sysctl.d/88-vm.overcommit_memory.conf
vm.overcommit_memory = 1
SYSCTL_MEM
 
# increase max connections
sysctl -w net.core.somaxconn=65535 && cat <<SYSCTL_CONN > /etc/sysctl.d/88-net.core.somaxconn.conf
net.core.somaxconn = 65535
SYSCTL_CONN
 
sysctl -w fs.file-max=100000 && cat <<SYSCTL_FILEMAX > /etc/sysctl.d/88-fs.file-max.conf
fs.file-max = 100000
SYSCTL_FILEMAX
 
sed -i "s|^tcp-backlog [[:digit:]]\+|tcp-backlog 65535|" /etc/redis.conf
 
# enable redis service on reboot
systemctl enable redis
 
# start service
(service redis status > /dev/null && service redis restart) || service redis start

安裝Node.js 和 PM2

#!/bin/bash
 
# make sure the SRC_NODE_VERSION is set
if [[ -z $SRC_NODE_VERSION ]]; then
  echo "You must specify a node version using \$SRC_NODE_VERSION";
else
  # Select node version to install
  curl --silent --location https://rpm.nodesource.com/setup_$SRC_NODE_VERSION.x | bash -
   
  # install via yum
  yum install -y git gcc-c++ make nodejs
fi
 
# PM2 - install as global
npm install pm2@latest -g

創建 appuser

adduser appuser
passwd appuser

爲appuser創建PM2

mkdir ~/apps
cd /apps
 
pm2 start ~/apps/myapp/server.js --name=myapp
pm2 status myapp
pm2 restart myapp

相關文章:

  • 開發也需了解的運維知識之Docker
  • 架構師心得:實戰電子版書籍JVM+多線程+Kafka+Redis+Nginx+MySQL
  • DNS域名解析服務bind
  • 阿裏一面面經詳解:kafka消息重複消費場景,你怎麽看待996?
  • 訴說阿裏一面經曆:技術個人主見相結合的面試,996你如何看待?
  • 使用nginx-module-vts監控各虛擬主機的流量
科技

發佈留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

©2025 快讀 | 服務協議 | DMCA | 聯繫我們