基于centOS7.5 x64/openjdk1.8/tomcat8.5/nginx1.16/nodejs/mysql8.0/redis3/git的服务器环境配置)

2023-11-03

基于centOS7.5 64/openjdk1.8/tomcat/nginx/nodejs/mysql5.7/git的服务器环境配置)

我以前的三年和未来的三年从事网站开发,主要手段是JAVA,python,nodejs,前端大套间,偶尔写写服务器脚本,做做自动化部署。记录这篇博客的目的在于记录服务器部署过程,很多次都要重新部署服务器,什么安装openjdk然后配https,做过就忘了,下次又重新开始,很烦恼。记下来吧,要配服务器的时候直接过来拔就是了*

第一步、更新yum仓库

//新安装的服务器更新一下yum的版本,这一步不是强制要求,详细参考update与upgrade的用法和作用
ruan$ yum -y update

第二步、 先安装简单的东西

2.1 git

git官方网址:https://git-scm.com/download/linux, git官方的download页面推荐用法是直接使用yum安装git,因为版本对git的影响实则不大,一般来说,不需要下载源码自己编译或者去找新版本的仓库。

ruan$ yum install -y git
// 总下载量:4.5 M
// 安装大小:22 M

2.2 nginx

  • 安装nginx,nginx的中文网站有关于自己编译源码安装的手段:
    http://www.nginx.cn/install
    不过源码编译很麻烦,在centOS中采用yum安装就可以了,对于作为普通的服务器来说,各个版本的nginx差异不大,使用yum安装默认版本nginx:
//总下载量:4.2 M
//安装大小:14 M
ruan$ yum -y install nginx
  • 查看一下安装的版本:
ruan$ yum list nginx
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
已安装的软件包
nginx.x86_64                        1:1.16.1-1.el7                         @epel
  • 启动nginx:
ruan$ systemctl start nginx.service
  • 查看nginx服务的状态(以下是正常启动的状态):
[root@VM_7_129_centos ~]# systemctl status nginx.service
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since 三 2019-12-18 13:42:14 CST; 1min 1s ago
  Process: 29192 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 29190 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 29188 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 29194 (nginx)
   CGroup: /system.slice/nginx.service
           ├─29194 nginx: master process /usr/sbin/nginx
           └─29195 nginx: worker process

12月 18 13:42:14 VM_7_129_centos systemd[1]: Starting The nginx HTTP and re....
12月 18 13:42:14 VM_7_129_centos nginx[29190]: nginx: the configuration fil...k
12月 18 13:42:14 VM_7_129_centos nginx[29190]: nginx: configuration file /e...l
12月 18 13:42:14 VM_7_129_centos systemd[1]: Failed to parse PID from file ...t
12月 18 13:42:14 VM_7_129_centos systemd[1]: Started The nginx HTTP and rev....
Hint: Some lines were ellipsized, use -l to show in full.
  • 关闭nginx
ruan$ systemctl stop nginx.service
  • 设置开机自动启动服务
ruan$ systemctl enable nginx.service
  • 简单配置
    • 首先切换到== /etc/nginx ==下,这是nginx配置的根目录,以后配置https,pem等文件就要丢在这个位置。:
      conf.d                  koi-utf             scgi_params
      default.d               koi-win             scgi_params.default
      fastcgi.conf            mime.types          uwsgi_params
      fastcgi.conf.default    mime.types.default  uwsgi_params.default
      fastcgi_params          nginx.conf          win-utf
      fastcgi_params.default  nginx.conf.default
      // 当前目录下有一个nginx.conf文件,这是nginx配置的根配置文件,其中有一句:
      // include /etc/nginx/conf.d/*.conf;
      // 这一句说明conf.d目录下的**.conf都会被加载成为配置文件,所以我们的配置文件自己书写,然后保存
      // 在conf.d下面就行了
      
      其中nginx.conf:
      # For more information on configuration, see:
      #   * Official English Documentation: http://nginx.org/en/docs/
      #   * Official Russian Documentation: http://nginx.org/ru/docs/
      
      user nginx;
      worker_processes auto;
      error_log /var/log/nginx/error.log;
      pid /run/nginx.pid;
      
      # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
      include /usr/share/nginx/modules/*.conf;
      
      events {
          worker_connections 1024;
      }
      
      http {
          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  main;
      
          sendfile            on;
          tcp_nopush          on;
          tcp_nodelay         on;
          keepalive_timeout   65;
          types_hash_max_size 2048;
      
          include             /etc/nginx/mime.types;
          default_type        application/octet-stream;
      
          # Load modular configuration files from the /etc/nginx/conf.d directory.
          # See http://nginx.org/en/docs/ngx_core_module.html#include
          # for more information.
          include /etc/nginx/conf.d/*.conf;
      
          server {
              listen       80 default_server;
              listen       [::]:80 default_server;
              server_name  _;
              root         /usr/share/nginx/html;
      
              # Load configuration files for the default server block.
              include /etc/nginx/default.d/*.conf;
              location / {
              }
      
              error_page 404 /404.html;
                  location = /40x.html {
              }
      
              error_page 500 502 503 504 /50x.html;
                  location = /50x.html {
              }
          }
      
      # Settings for a TLS enabled server.
      #
      #    server {
      #        listen       443 ssl http2 default_server;
      #        listen       [::]:443 ssl http2 default_server;
      #        server_name  _;
      #        root         /usr/share/nginx/html;
      #
      #        ssl_certificate "/etc/pki/nginx/server.crt";
      #        ssl_certificate_key "/etc/pki/nginx/private/server.key";
      #        ssl_session_cache shared:SSL:1m;
      #        ssl_session_timeout  10m;
      #        ssl_ciphers HIGH:!aNULL:!MD5;
      #        ssl_prefer_server_ciphers on;
      #
      #        # Load configuration files for the default server block.
      #        include /etc/nginx/default.d/*.conf;
      #
      #        location / {
      #        }
      #
      #        error_page 404 /404.html;
      #            location = /40x.html {
      #        }
      #
      #        error_page 500 502 503 504 /50x.html;
      #            location = /50x.html {
      #        }
      #    }
      
      }
      
    • 切换到conf.d目录,新建my.conf,文件名随意
      因为上面片段的include与server节点是同级的,所以我们在自己的配置文件中直接写server节点配置就可以了。如果默认的话,其实可以不用写配置文件,直接80端口就行了,修改其中server节点下的root指向的位置即可。默认指向:root /usr/share/nginx/html;
    • 配置https(详情我是参照的腾讯云,请你们自己参考别的)
      在你的my.conf中增加如下代码:
      server {
           #SSL 访问端口号为 443
           listen 443; 
           #填写绑定证书的域名
           server_name www.domain.com; 
           #启用 SSL 功能
           ssl on;
           #证书文件名称
           ssl_certificate 1_www.domain.com_bundle.crt; 
           #私钥文件名称
           ssl_certificate_key 2_www.domain.com.key; 
           ssl_session_timeout 5m;
           #请按照以下协议配置
           ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
           #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
           ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
           ssl_prefer_server_ciphers on;
           location / {
              #网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
               root /var/www/www.domain.com; 
               index  index.html index.htm;
           }
       }
      
      其中server_name填写域名,比如www.ruankun.xyz
      ssl_certificate 1_www.domain.com_bundle.crt;填写你的文件名
      ssl_certificate_key 2_www.domain.com.key; 一样填写你的文件名
      location节点看情况部署
    • 测试配置文件是否正确
      ruan$ nginx -t
      //正确的输出
      nginx: [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead in /etc/nginx/conf.d/my.conf:7
      nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
      nginx: configuration file /etc/nginx/nginx.conf test is successful
      
    • 配置http跳转https
      http跳转https的方案有很多种:
      1. 页面中添加 JS 脚本
      2. 后端程序中添加重定向
      3. 通过 Web 服务器实现跳转
      4. rewrite 功能
      在这个地方,我们通过rewrite来实现http跳转https.在my.conf中继续加入如下代码:
      注意更改其中的server_name节点。
server {
    listen 80;
    #填写绑定证书的域名
    server_name www.ruankun.xyz;
    #把http的域名请求转成https
    rewrite ^(.*)$ https://$host$1 permanent;
}

第三步、安装MySQL8.0

3.1 更新rpm包

安装mysql8.0, 默认的yum里面就是mariaDB, 不晓得用不用得,所以要重新下载rpm, 官方rpm下载地址:
https://dev.mysql.com/downloads/repo/yum/
redhat和centOS源出同门,选red hat版本的就行了。
rpm下载地址(red hat 7):https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm

  • 下载rpm包:
ruan$ wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm
  • 安装rpm包到yum仓库(-ivh: i install安装, v verbose打印全日志, h hash安装进度)
ruan$ rpm -ivh mysql80-community-release-el7-3.noarch.rpm
警告:mysql80-community-release-el7-3.noarch.rpm: 头V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY
	准备中...                          ################################# [100%]
	正在升级/安装...
	   1:mysql80-community-release-el7-3  ################################# [100%]
  • 查看是否可以安装:
ruan$ yum repolist all | grep mysql

输出如下:

mysql-cluster-7.5-community/x86_64 MySQL Cluster 7.5 Community      禁用
mysql-cluster-7.5-community-source MySQL Cluster 7.5 Community - So 禁用
mysql-cluster-7.6-community/x86_64 MySQL Cluster 7.6 Community      禁用
mysql-cluster-7.6-community-source MySQL Cluster 7.6 Community - So 禁用
mysql-cluster-8.0-community/x86_64 MySQL Cluster 8.0 Community      禁用
mysql-cluster-8.0-community-source MySQL Cluster 8.0 Community - So 禁用
mysql-connectors-community/x86_64  MySQL Connectors Community       启用:    131
mysql-connectors-community-source  MySQL Connectors Community - Sou 禁用
mysql-tools-community/x86_64       MySQL Tools Community            启用:    100
mysql-tools-community-source       MySQL Tools Community - Source   禁用
mysql-tools-preview/x86_64         MySQL Tools Preview              禁用
mysql-tools-preview-source         MySQL Tools Preview - Source     禁用
mysql55-community/x86_64           MySQL 5.5 Community Server       禁用
mysql55-community-source           MySQL 5.5 Community Server - Sou 禁用
mysql56-community/x86_64           MySQL 5.6 Community Server       禁用
mysql56-community-source           MySQL 5.6 Community Server - Sou 禁用
mysql57-community/x86_64           MySQL 5.7 Community Server       禁用
mysql57-community-source           MySQL 5.7 Community Server - Sou 禁用
mysql80-community/x86_64           MySQL 8.0 Community Server       启用:    145
mysql80-community-source           MySQL 8.0 Community Server - Sou 禁用

看到 mysql80-community/x86_64 MySQL 8.0 Community Server 启用: 145, 可以开始安装了

3.2 安装mysql:

  • 安装
ruan$ yum install -y mysql-community-server
安装  3 软件包 (+3 依赖软件包)

总下载量:473 M

这样就会自动开始安装mysql了。

  • 启动服务
ruan$ systemctl start mysqld.service
  • 查看服务状态以及开机启动
ruan$ systemctl status mysqld.service
ruan$ systemctl stop mysqld.service
ruan$ systemctl enable mysqld.service
  • 初次连接mysql
    第一次安装的mysql密码在/var/log/mysqld.log中:
ruan$ cat mysqld.log
2019-12-18T10:29:01.406509Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.18) initializing of server in progress as process 6124
2019-12-18T10:29:07.688866Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: HowQel2iu3+a
2019-12-18T10:29:13.492460Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.18) starting as process 6227
2019-12-18T10:29:14.866511Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2019-12-18T10:29:14.915740Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.18'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server - GPL.

其中密码是: HowQel2iu3+a
连接mysql并修改密码,修改密码的语句:

ruan$ ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1234';

紧接着需要设置root的远程访问:

mysql>  use mysql
mysql> update user set host='%' where user='root';
mysql> flush privileges;
  • 卸载mySQL

为什么要卸载?原因很多,例如官方声明:mysql8不支持在my.conf中设置lower_case_table_names变量,只能在初始化时指定该变量,如果你没有,那么默认你的mysql就不会忽略大小写敏感问题,导致你大小写出现很多问题。
卸载mysql:

ruan$ systemctl stop mysqld.service
ruan$ rpm -qa|grep -i mysql
//找到mysql的包后,挨着卸载,如果出现依赖错误就先卸载依赖的。
ruan$ rpm -ev mysql-community-client-8.0.11-1.el7.x86_64 --nodeps
...

删除相关目录:

ruan$ find / -name mysql
/var/lib/mysql/mysql
/etc/selinux/targeted/active/modules/100/mysql
/root/.gradle/caches/modules-2/files-2.1/mysql
/root/.gradle/caches/modules-2/metadata-2.82/descriptors/mysql
ruan$ rm -rf /var/lib/mysql/
ruan$ rm -rf /var/lib/mysql/mysql
ruan$ rm -rf /etc/selinux/targeted/active/modules/100/mysql

卸载到此完成。

第四步、安装openjdk1.8

yum默认安装的java只有jre,没有jdk,所以安装时需要小心。

4.1找open jdk 1.8

ruan$ yum search java-1.8.0|grep openjdk

as is shown:

java-1.8.0-openjdk.i686 : OpenJDK Runtime Environment 8
java-1.8.0-openjdk.x86_64 : OpenJDK Runtime Environment 8
java-1.8.0-openjdk-accessibility.i686 : OpenJDK accessibility connector
java-1.8.0-openjdk-accessibility.x86_64 : OpenJDK accessibility connector
java-1.8.0-openjdk-accessibility-debug.i686 : OpenJDK 8 accessibility connector
java-1.8.0-openjdk-accessibility-debug.x86_64 : OpenJDK 8 accessibility
java-1.8.0-openjdk-debug.i686 : OpenJDK Runtime Environment 8 with full debug on
java-1.8.0-openjdk-debug.x86_64 : OpenJDK Runtime Environment 8 with full debug
java-1.8.0-openjdk-demo.i686 : OpenJDK Demos 8
java-1.8.0-openjdk-demo.x86_64 : OpenJDK Demos 8
java-1.8.0-openjdk-demo-debug.i686 : OpenJDK Demos 8 with full debug on
java-1.8.0-openjdk-demo-debug.x86_64 : OpenJDK Demos 8 with full debug on
java-1.8.0-openjdk-devel.i686 : OpenJDK Development Environment 8
java-1.8.0-openjdk-devel.x86_64 : OpenJDK Development Environment 8
java-1.8.0-openjdk-devel-debug.i686 : OpenJDK Development Environment 8 with
java-1.8.0-openjdk-devel-debug.x86_64 : OpenJDK Development Environment 8 with
java-1.8.0-openjdk-headless.i686 : OpenJDK Headless Runtime Environment 8
java-1.8.0-openjdk-headless.x86_64 : OpenJDK Headless Runtime Environment 8
java-1.8.0-openjdk-headless-debug.i686 : OpenJDK Runtime Environment with full
java-1.8.0-openjdk-headless-debug.x86_64 : OpenJDK Runtime Environment with full
java-1.8.0-openjdk-javadoc.noarch : OpenJDK 8 API documentation
java-1.8.0-openjdk-javadoc-debug.noarch : OpenJDK 8 API documentation for
java-1.8.0-openjdk-javadoc-zip.noarch : OpenJDK 8 API documentation compressed
java-1.8.0-openjdk-javadoc-zip-debug.noarch : OpenJDK 8 API documentation
java-1.8.0-openjdk-src.i686 : OpenJDK Source Bundle 8
java-1.8.0-openjdk-src.x86_64 : OpenJDK Source Bundle 8
java-1.8.0-openjdk-src-debug.i686 : OpenJDK Source Bundle 8 for packages with
java-1.8.0-openjdk-src-debug.x86_64 : OpenJDK Source Bundle 8 for packages with

其中,java-1.8.0-openjdk-devel.i686这个是OpenJDK Development Environment 8
我们就是要安装这个:

ruan$ yum install -y java-1.8.0-openjdk-devel
...
完毕!
  • 验证openJDK安装完毕
ruan$ java
...
ruan$ javac
...
ruan$ java -version
openjdk version "1.8.0_232"
OpenJDK Runtime Environment (build 1.8.0_232-b09)
OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode)

第五步、an装redis

redis官网上有安装教程:https://redis.io/download

5.1 搜索yum中的redis并安装

yum仓库中的redis是3.x的版本,现在已经更新到5.x了,但我觉得3.x就够用了,好装稳定才是硬道理。

ruan$ yum list redis
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
可安装的软件包
redis.x86_64                          3.2.12-2.el7                          epel
ruan$ yum install -y redis
总下载量:648 k
安装大小:1.7 M

这redis也太小了,真的厉害。

5.2 启动redis、查看状态并设置开机启动

ruan$ systemctl start redis.service
ruan$ systemctl status redis.service
● redis.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/redis.service.d
           └─limit.conf
   Active: active (running) since 三 2019-12-18 23:46:17 CST; 6s ago
 Main PID: 22121 (redis-server)
   CGroup: /system.slice/redis.service
           └─22121 /usr/bin/redis-server 127.0.0.1:6379

12月 18 23:46:17 VM_7_129_centos systemd[1]: Starting Redis persistent key-....
12月 18 23:46:17 VM_7_129_centos systemd[1]: Started Redis persistent key-v....
Hint: Some lines were ellipsized, use -l to show in full.
ruan$ systemctl enable redis.service

5.3 连接redis并设置登录密码

ruan$ redis-cli
127.0.0.1:6379>
127.0.0.1:6379>config set requirepass [your password]

六、 安装gradle

一般spring项目会采用maven或者gradle打包,我们常用gradle,所以需要安装gradle,gradle直接去网上下载就是了。

6.1 下载gradle并解压

ruan$ wget https://downloads.gradle-dn.com/distributions/gradle-6.0.1-bin.zip
ruan$ cp gradle-6.0.1-bin.zip /usr/local/gradle-6.0.1-bin.zip
ruan$ cd /usr/local
ruan local$  unzip gradle-6.0.1-bin.zip
...

6.2 配置环境变量

ruan$ vim /etc/profile

输入以下内容并保存

export GRADLE_HOME=/usr/local/gradle-6.0.1
export GRADLE_BASE=/usr/local/gradle-6.0.1
export PATH=$PATH:$GRADLE_HOME/bin

使环境变量配置生效

ruan$ source /etc/profile

测试gradle是否安装正确:

ruan$ gradle --version
Welcome to Gradle 6.0.1!

Here are the highlights of this release:
 - Substantial improvements in dependency management, including
   - Publishing Gradle Module Metadata in addition to pom.xml
   - Advanced control of transitive versions
   - Support for optional features and dependencies
   - Rules to tweak published metadata
 - Support for Java 13
 - Faster incremental Java and Groovy compilation
 - New Zinc compiler for Scala
 - VS2019 support
 - Support for Gradle Enterprise plugin 3.0

For more details see https://docs.gradle.org/6.0.1/release-notes.html


------------------------------------------------------------
Gradle 6.0.1
------------------------------------------------------------

Build time:   2019-11-18 20:25:01 UTC
Revision:     fad121066a68c4701acd362daf4287a7c309a0f5

Kotlin:       1.3.50
Groovy:       2.5.8
Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          1.8.0_232 (Oracle Corporation 25.232-b09)
OS:           Linux 3.10.0-862.el7.x86_64 amd64

七、安装tomcat

使用某些垃圾软件,比如webbuilder(特别讨厌这玩意儿,但公司买了这软件, 必须要用),所以需要tomcat环境的支撑。安装tomcat8.5.

7.1 获取tomcat并保存到local

ruan$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.50/bin/apache-tomcat-8.5.50.tar.gz
ruan$ cp apache-tomcat-8.5.50.tar.gz /usr/local/
ruan$ cd /usr/local
ruan local$ tar -xvzf apache-tomcat-8.5.50.tar.gz

7.2 把tomcat配置到环境变量

不想折腾tomcat加到服务了,所以直接把bin配置到环境变量算了,直接./startup.sh就可以启动tomcat了

ruan$ vim /etc/profile

在后面接着加上

export CATALINA_HOME=/usr/local/apache-tomcat-8.5.50
export CATALINA_BASE=/usr/local/apache-tomcat-8.5.50
export PATH=$PATH:$CATALINA_HOME/bin

退出保存,使环境变量生效:

source /etc/profile

7.3 启动tomcat(配置端口过于简单,略)

ruan$ ./startup.sh
Using CATALINA_BASE:   /usr/local/apache-tomcat-8.5.50
Using CATALINA_HOME:   /usr/local/apache-tomcat-8.5.50
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-8.5.50/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/apache-tomcat-8.5.50/bin/bootstrap.jar:/usr/local/apache-tomcat-8.5.50/bin/tomcat-juli.jar
Tomcat started.

八、安装nodejs环境

因为前端采用npm构建,所以不安装nodejs环境实在是受不了,安装nodejs环境。

8.1 下载并安装node环境

nodejs中文网站:http://nodejs.cn/download/,官网正好抽风,不好意思。

ruan$ wget https://cdn.npm.taobao.org/dist/node/v12.14.0/node-v12.14.0-linux-x64.tar.xz

因为是xz结尾的压缩文件,解压缩:

ruan$ mv node-v12.14.0-linux-x64.tar.xz /usr/local/
ruan$ xz -d node-v12.14.0-linux-x64.tar.xz
ruan$ tar -xf node-v12.14.0-linux-x64.tar

解压后配置基础环境变量:

vim /etc/profile

加上这句话

export PATH=$PATH:/usr/local/node-v12/bin

使环境变量生效

source /etc/profile

8.2 测试node是否安装正确

ruan$ node -v
v12.14.0
ruan$ npm -v
6.13.4

8.3 深入配置(非必须)

npm安装包使用命令e.g: npm install -g express, 如果不希望安装在默认目录,则需要配置npm包的安装路径, 通常配置在node里面。

  • 新建文件夹(注意你的node目录名字跟我的不一样,不要全抄我的下面命令)
ruan$ cd /usr/local/node-v12
ruan$ mkdir node_global
ruan$ mkdir node_cache
  • 给npm添加配置项:
ruan$ npm config set prefix="/usr/local/node-v12/node_global"
ruan$ npm config set cache="/usr/local/node-v12/node_cache"
  • 配置最后的环境变量
ruan$ vim /etc/profile

输入如下信息(不太理解这个配置的是否完全正确,但可以用):

export PATH=$PATH:/usr/local/node-v12/bin
export NODE_PATH=/usr/local/node-v12/node_global/node_modules
export PATH=$PATH:/usr/local/node-v12/node_global

使环境变量生效:

ruan$ source /etc/profile

安装express测试一下:

ruan$ npm install -g express
+ express@4.17.1
added 50 packages from 37 contributors in 32.143s

在以下目录找到express:

/usr/local/node-v12/node_global/lib/node_modules/express

使用一下:

ruan$ touch test.js
ruan$ vim test.js

键入如下内容:

require('express')
console.log('hello world');

保存退出,运行一下:

ruan$ node test.js
internal/modules/cjs/loader.js:800
    throw err;
    ^

Error: Cannot find module 'express'
Require stack:
- /root/testNode2/index.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:797:15)
    at Function.Module._load (internal/modules/cjs/loader.js:690:27)
    at Module.require (internal/modules/cjs/loader.js:852:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at Object.<anonymous> (/root/testNode2/index.js:1:1)
    at Module._compile (internal/modules/cjs/loader.js:959:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
    at Module.load (internal/modules/cjs/loader.js:815:32)
    at Function.Module._load (internal/modules/cjs/loader.js:727:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1047:10) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ '/root/testNode2/index.js' ]
}

全局的是不能用了,环境变量没有配置好,不过我们都这样用,不存在问题:

ruan$ cd wxhouse
ruan$ npm init
ruan$ npm install express --save
ruan$ vim index.js

输入:

require('express')
console.log('hello world');

运行:

ruan$ node index.js
hello world

九、总结

总算写完了,以后配置服务器就来这儿扒,还有一部分没写完,在下一步中介绍怎么:

  • 如何配置docker容器并将端口映射到外层,然后使用nginx访问不同的docker,实现负载均衡。
  • 如何配置jenkins自动化部署,以后代码推送到git上再也不用手动build run了,妈妈再也不用担心改一百次BUG就要打开服务器一百次然后手动java -jar xxx.jar了,还要手动杀进程,写配置文件,run,重启容器,麻不麻烦啊?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于centOS7.5 x64/openjdk1.8/tomcat8.5/nginx1.16/nodejs/mysql8.0/redis3/git的服务器环境配置) 的相关文章

  • vue + echarts(5.2.1)仿3d地图

    地图json下载地址 https download csdn net download qq 42619759 87103469
  • 软件测试---功能分解、等价类、边界值、因果图、错误推测、正交实验、场景法

    一 黑盒测试 1 功能分解法 功能分解法就是把软件需求中的每一个功能加以分解 分解为功能单位 以功能单位为对象进行测试用例涉及 例子 用户管理系统可以分为如下 当然也可以进一步往下分解 根据上面的功能分解图可以对分解出来的最底层功能单元逐个
  • 矩阵伪逆介绍及C++/OpenCV/Eigen的三种实现

    矩阵A的伪逆 Moore Penrose pseudoinverse 定义为 A VD UT 其中 U D和V是矩阵A奇异值分解后得到的矩阵 对角矩阵D的伪逆D 是非零元素取倒数之后再转置得到的 当矩阵A的列数多于行数时 使用伪逆求解线性方
  • 设计模式—单例模式(饿汉式、懒汉式)

    目录 一 什么是单例模式 二 单例模式的类型 三 单例模式的公共特征 四 单例模式 饿汉式 五 单例模式 懒汉式 5 1 懒汉式实现方式一 有问题不提倡使用 5 2 懒汉式实现方式二 提倡使用 一 什么是单例模式 相信大家在面试过程中被提到
  • 如何给图片设置按钮的效果

    前端是如何给图片设置交互效果的 前端可以通过以下几种方式为图片设置交互效果 1 CSS hover 选择器 最简单的方式是使用 CSS 的 hover 选择器 当鼠标悬停在图片上时触发交互效果 例如 css img width 200px
  • 准确率94%!Python 机器学习识别微博或推特机器人

    原文来自Python实用宝典 准确率94 Python 机器学习识别微博或推特机器人 推特或微博机器人的存在其实是比较危险的 他们可以制造虚假的流量 传播谣言 甚至执行一些令人汗颜的恶意操作 这里我们使用kaggle纽约大学2017年机器学
  • SpringCache

    目录 简介 整合SpringCache简化缓存开发 Cacheable使用 原理 自定义缓存配置 CacheEvict的使用 自定义key生成策略 SpringCache的不足 简介 给每一个需要缓存的业务加上缓存的使用逻辑 缓存的使用 就
  • window子系统 wsl2 ubuntu子系统配置代理

    原理 由于 ubuntu 子系统是一个虚拟机 虚拟机安装下载包缓慢 而我们需要虚拟机使用到外部window电脑的代理网络使子系统能快速安装搭建服务 方法 ubuntu 子系统需要获取到window的IPV4地址代理端口设置 http pro
  • C语言中#include<stdio.h>和#include“stdio.h“的区别

    在C语言中 include
  • ajax回调函数运用(由前端到后端代码全过程)

    ajax回调函数 function initActivityWorks var backFun function jsonObject if jsonObject success showSuccessOrErrorModel 获取信息错误
  • Qt动画效果展示

    在上一篇博文 Qt动画框架 原创翻译 中 我给大家原创翻译了Qt动画框架并且有文字和代码以及图片共同描述 今天在这篇博文中 主要实践Qt动画 做一个实例来讲解Qt动画使用 其界面如下图所示 由于没有录制为gif动画图片 所以请各位下载查看效
  • nginx php-fpm 输出php错误日志

    nginx是一个web服务器 因此nginx的access日志只有对访问页面的记录 不会有php 的 error log信息 nginx把对php的请求发给php fpm fastcgi进程来处理 默认的php fpm只会输出php fpm
  • 并发编程专题06-java锁的深度化

    Java锁的深度化 下一篇 Disruptor框架 悲观锁 乐观锁 排他锁 重入锁 悲观锁与乐观锁 悲观锁 悲观锁悲观的认为每一次操作都会造成更新丢失问题 在每次查询时加上排他锁 每次去拿数据的时候都认为别人会修改 所以每次在拿数据的时候都
  • 快手短视频广告投放是怎么收费的 快手信息流广告收费标准

    一 快手短视频广告是怎么收费的 1 按展示收费 按展示收费是大部分广告主比较希望的投放方式 这种投放方式称为千人展示成本 也叫CPM模式 即一个广告展示给一千个用户所需要的费用 这种广告投放方式的特点是覆盖面广 但不能精准投放给目标用户 因
  • XSS注入基础入门篇

    XSS注入基础入门篇 1 XSS基础概念 2 XSS的分类以及示例 2 1 反射型XSS 2 1 1 示例1 dvwa low 级别的反射型XSS 2 1 2 攻击流程 2 2 DOM型XSS 2 2 1 示例2 DOM型XSS注入 1 环
  • 详解numpy.random.choice函数

    文章目录 函数原型 参数解析 该函数的注意事项 例子 示例代码 示例结果 参考 numpy的random模块中的choice函数用于从给定一维 1 D 数组中生成随机样本 本博客详细节将该函数的API 并给出示例代码和结果 函数原型 num
  • SpringBoot2.0(mybatis-plus初始使用)

    目录 一 介绍 二 SpringBoot2 x整合MybatisPlus Lombok 2 1 添加依赖 pom 2 2 配置数据库信息 application properties 2 3 工程结构初始化 三 创建接口返回统一对象 四 创
  • Android 第三方 ROM

    LineageOS 原 CyanogenMod CM 因原小组中几位成员不满其后的商业化不开源之路 以 Chainfire 为代表的几位成员遂脱离 CM 小组创立了现在的 LineageOS 其沿袭了 CM 稳定的特点 虽尚存少许 Bug
  • 4 17 0 RSA 私钥和公钥的一些自己的理解

    分享一下我老师大神的人工智能教程 零基础 通俗易懂 风趣幽默 还带黄段子 希望你也加入到我们人工智能的队伍中来 https blog csdn net jiangjunshow RSA 是非对称加密算法对称的加密算法 加密和解密都是使用的一
  • pandas函数read_csv()参数及例子

    1 read csv函数的定义 pd read csv filepath or buffer FilePathOrBuffer sep

随机推荐

  • R语言—添加程序运行的进度条

    循环是在处理各种任务的最常用的结构 一般的少量数据循环过程可以在几秒之内完成 稍大一点的也就是分钟的事情 但是在处理大量数据的时候 这个循环就可能会运行小时甚至几天的时间 当然还是要看配置和代码质量的 在这种情况下 程序的运行就变成了一种毫
  • 谷歌验单接口报projectNotLinked错误

    最近公司的一款安卓应用 用户购买商品后 服务端在调用谷歌接口进行验单的时候 谷歌接口会报projectNotLinked的错误 错误如下 error errors domain androidpublisher reason project
  • 对Flink集群进行远程调试

    导读 在学习或者使用各个大数据框架的时候 往往想对runtime层次的代码进行调试或者跟踪阅读 但其往往部署在其他机器上 因此需要进行远程调试 本文以Flink为例 介绍如何通过IDEA进行Flink的runtime层次的远程调试 环境 F
  • Ant Design Vue select下拉列表设置默认值

    在项目中需要为Ant Design Vue 的 select 组件设置一个默认值 如下图所示的状态下拉选择框 默认选择全部 代码如下 1
  • Linux--硬链接和软链接

    文件都有文件名与数据 这在 Linux 上被分成两个部分 用户数据 user data 与元数据 metadata 用户数据 即文件数据块 data block 数据块是记录文件真实内容的地方 而元数据则是文件的附加属性 如文件大小 创建时
  • Python常用第三方库——简介及下载地址

    Python常用第三方库 可以在 The Python Package Index PyPI 软件库 官网主页 https pypi org 查询 下载 和 发布 Python包或库 网络爬虫 requests https pypi org
  • 如何使用python来进行回归分析

    文章主要介绍两种常见的回归分析方法 以及其对应的Python实现操作 目录 什么是回归分析 为什么使用回归分析 回归分析技术有哪些 使用Python实现回归分析 什么是回归分析 在统计学中 回归分析 regression analysis
  • ​第10章 存储过程与存储函数​

    第10章存储过程与存储函数 10 1修改MySQL的结束符为 delimiter delimiter 10 2 创建一个不带参数的存储过程P str 输出 Hello MySQL 10 4 建立存储函数P math 如果 高等数学 课程的平
  • VUE element-ui之上传身份证照片正反面详细代码

    步骤 定义上传组件
  • 6年软件测试经历:成长、迷茫、奋斗

    前言 测试工作6年 经历过不同产品 共事过不同专业背景 能力的同事 踩过测试各种坑 遇到过各种bug 测试职场生涯积极努力上进业务和技术能力快速进步过 也有努力付出却一无所得过 有对测试生涯前景充满希望认为一片朝气蓬勃过 也有对中年危机思考
  • 英语——分享篇——每日100词——201-300

    chess che车 拼音 ss两个美女 编码 车里有两个美女在下国际象棋 April ap阿婆 拼音 ri日 拼音 l棍子 编码 四月份阿婆每日拿着棍子 palace place地方 这个地方是宫殿 bottle bo60 象形 ttle
  • 1分钟搭建swagger3好看实用接口文档

    这里写自定义目录标题 1分钟搭建swagger3好看实用接口文档 引入jar 包 直接copy 创建config文件 直接copy 启动访问 1分钟搭建swagger3好看实用接口文档 不废话 引入jar 包 直接copy
  • request entity too large

    1 分2中情况 1 带413 请求文件太大 不包含参数 413 Request Entity Too Large 2 不带413 请求实体太大 包含参数 文件等 客户端发送的实体主体部分比服务器能够或者希望处理的要大 request ent
  • Unity中的C#开发基础(1)

    主要记录一些和C 有区别的地方 1 把信息和反馈打印到控制台 1 Debug Log 2 Debug LogFormat Debug LogFormat Hello world add 0 and 1 firstNumber secondN
  • 安装nginx之后,处理 conf.d下无default.conf文件

    在学习nginx的过程中 安装nginx后找不到conf d目录下的default conf文件 其原因是该操作系统下的epel源是默认下载就是Fedora操作系统的 方案一 解决方法 重新进行安装nginx 并修改nginx的epel镜像
  • python实现n个学生的3门成绩总分排序,平均分

    直接上代码 解释在注释 不懂评论留言 必回 4 输入n个学生的3门成绩 分别计算n个学生的总分 每门功课的平均分 按学生的总分降序显示学生的信息 并输出每门功课的平均分 print 请输入一共多少个学生 end n int input 创建
  • Flutter 悬浮弹出效果

    最近在 Flutter 的使用中需要做一个悬浮弹窗的效果 通过查阅资料了解 Overlay 可以做出悬浮框的效果 但没有弹出效果 不符合我的预期 后来发现其实并不一定要真的悬浮 通过 showModalBouttonSheet方法和 Sta
  • JDBC的配置文件与工具类的封装

    package cn sxt login utils import java io IOException import java sql Connection import java sql DriverManager import ja
  • mybatis插入动态表名

    项目场景 项目中需要动态的选择插入的数据表名 但是在实际使用过程中总会遇到部分问题 问题描述 在xml中填写sql语句 由于表中含有月份信息 需要动态的选择表名 然而用 的方式传参 总是显示语句错误
  • 基于centOS7.5 x64/openjdk1.8/tomcat8.5/nginx1.16/nodejs/mysql8.0/redis3/git的服务器环境配置)

    基于centOS7 5 64 openjdk1 8 tomcat nginx nodejs mysql5 7 git的服务器环境配置 我以前的三年和未来的三年从事网站开发 主要手段是JAVA python nodejs 前端大套间 偶尔写写