Jekyll2022-12-06T11:07:46+00:00/feed.xml博客迁移中…Hope is a good thing, maybe the best of things, and no good thing ever dies.Edmond.ShiWelcome to Jekyll!2022-12-05T11:17:42+00:002022-12-05T11:17:42+00:00/jekyll/update/2022/12/05/welcome-to-jekyll<h2 id="成长记录">成长记录</h2>
<h3 id="日期2022-12-05-班级视频">日期:2022-12-05 班级视频</h3>
<video controls="" width="100%" src="/assets/video/1359_1670235494.mp4"></video>
<p>You’ll find this post in your <code class="language-plaintext highlighter-rouge">_posts</code> directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run <code class="language-plaintext highlighter-rouge">jekyll serve</code>, which launches a web server and auto-regenerates your site when a file is updated.</p>
<p>Jekyll requires blog post files to be named according to the following format:</p>
<p><code class="language-plaintext highlighter-rouge">YEAR-MONTH-DAY-title.MARKUP</code></p>
<p>Where <code class="language-plaintext highlighter-rouge">YEAR</code> is a four-digit number, <code class="language-plaintext highlighter-rouge">MONTH</code> and <code class="language-plaintext highlighter-rouge">DAY</code> are both two-digit numbers, and <code class="language-plaintext highlighter-rouge">MARKUP</code> is the file extension representing the format used in the file. After that, include the necessary front matter. Take a look at the source for this post to get an idea about how it works.</p>
<p>Jekyll also offers powerful support for code snippets:</p>
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">print_hi</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
<span class="nb">puts</span> <span class="s2">"Hi, </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
<span class="n">print_hi</span><span class="p">(</span><span class="s1">'Tom'</span><span class="p">)</span>
<span class="c1">#=> prints 'Hi, Tom' to STDOUT.</span></code></pre></figure>
<p>Check out the <a href="https://jekyllrb.com/docs/home">Jekyll docs</a> for more info on how to get the most out of Jekyll. File all bugs/feature requests at <a href="https://github.com/jekyll/jekyll">Jekyll’s GitHub repo</a>. If you have questions, you can ask them on <a href="https://talk.jekyllrb.com/">Jekyll Talk</a>.</p>Edmond.Shi成长记录 日期:2022-12-05 班级视频Welcome to Jekyll!!!!!2022-12-05T11:17:42+00:002022-12-05T11:17:42+00:00/jekyll/update/2022/12/05/yuan-childhood<h2 id="成长记录">成长记录</h2>
<h3 id="日期2022-12-05-班级视频">日期:2022-12-05 班级视频</h3>
<video controls="" width="100%" src="/assets/video/1359_1670235494.mp4"></video>Edmond.Shi成长记录 日期:2022-12-05 班级视频基于 CentOS,Maven 安装12020-10-16T00:41:00+00:002020-10-16T00:41:00+00:00/maven/2020/10/16/maven-install<h2 id="下载安装包">下载安装包</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>🙈: wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
</code></pre></div></div>
<h2 id="使用-yum-安装">使用 yum 安装</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>🙈: yum -y install apache-maven
</code></pre></div></div>
<h2 id="查看版本">查看版本</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>🙈: mvn -v
</code></pre></div></div>Edmond.Shi下载安装包 🙈: wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo基于 CentOS,JDK安装2020-10-15T23:41:00+00:002020-10-15T23:41:00+00:00/java/2020/10/15/java-jdk-install<p>使用 yum 安装</p>
<h2 id="查看-java-可安装列表">查看 Java 可安装列表</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>🙈: yum -y list java*
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Available Packages
java-1.6.0-openjdk.x86_64 1:1.6.0.41-1.13.13.1.el7_3 base
....
</code></pre></div></div>
<h2 id="指定版本安装">指定版本安装</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>🙈: yum install java-1.8.0-openjdk.x86_64
</code></pre></div></div>
<h2 id="查看-java-版本">查看 Java 版本</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>🙈: java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
</code></pre></div></div>
<h2 id="通过yum安装的默认路径为usrlibjvm查看一下">通过yum安装的默认路径为:/usr/lib/jvm,查看一下</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>🙈: ls -al /usr/lib/jvm
total 12
drwxr-xr-x 3 root root 4096 Oct 16 00:02 .
dr-xr-xr-x. 41 root root 4096 Oct 16 00:02 ..
drwxr-xr-x 3 root root 4096 Oct 16 00:02 java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64
lrwxrwxrwx 1 root root 21 Oct 16 00:02 jre -> /etc/alternatives/jre
lrwxrwxrwx 1 root root 27 Oct 16 00:02 jre-1.8.0 -> /etc/alternatives/jre_1.8.0
lrwxrwxrwx 1 root root 35 Oct 16 00:02 jre-1.8.0-openjdk -> /etc/alternatives/jre_1.8.0_openjdk
lrwxrwxrwx 1 root root 51 Oct 16 00:02 jre-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64 -> java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre
lrwxrwxrwx 1 root root 29 Oct 16 00:02 jre-openjdk -> /etc/alternatives/jre_openjdk
</code></pre></div></div>
<h2 id="配置环境变量">配置环境变量</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>🙈: vim bash_profile
</code></pre></div></div>
<p>加入一下内容:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#set java environment
JAVA_HOME=/usr/lib/jvm/jre-openjdk
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME CLASSPATH PATH
</code></pre></div></div>
<p>快速生效</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>🙈: source .bash_profile
</code></pre></div></div>Edmond.Shi使用 yum 安装 查看 Java 可安装列表 🙈: yum -y list java* Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile Available Packages java-1.6.0-openjdk.x86_64 1:1.6.0.41-1.13.13.1.el7_3 base .... 指定版本安装 🙈: yum install java-1.8.0-openjdk.x86_64 查看 Java 版本 🙈: java -version openjdk version "1.8.0_262" OpenJDK Runtime Environment (build 1.8.0_262-b10) OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode) 通过yum安装的默认路径为:/usr/lib/jvm,查看一下 🙈: ls -al /usr/lib/jvm total 12 drwxr-xr-x 3 root root 4096 Oct 16 00:02 . dr-xr-xr-x. 41 root root 4096 Oct 16 00:02 .. drwxr-xr-x 3 root root 4096 Oct 16 00:02 java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64 lrwxrwxrwx 1 root root 21 Oct 16 00:02 jre -> /etc/alternatives/jre lrwxrwxrwx 1 root root 27 Oct 16 00:02 jre-1.8.0 -> /etc/alternatives/jre_1.8.0 lrwxrwxrwx 1 root root 35 Oct 16 00:02 jre-1.8.0-openjdk -> /etc/alternatives/jre_1.8.0_openjdk lrwxrwxrwx 1 root root 51 Oct 16 00:02 jre-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64 -> java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre lrwxrwxrwx 1 root root 29 Oct 16 00:02 jre-openjdk -> /etc/alternatives/jre_openjdk 配置环境变量 🙈: vim bash_profile 加入一下内容: #set java environment JAVA_HOME=/usr/lib/jvm/jre-openjdk PATH=$PATH:$JAVA_HOME/bin CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME CLASSPATH PATH 快速生效 🙈: source .bash_profile基于 CentOS,MySql 的管理2020-10-15T15:41:00+00:002020-10-15T15:41:00+00:00/db/2020/10/15/mysql-management<h2 id="启动及关闭-mysql-服务器">启动及关闭 MySQL 服务器</h2>
<p>首先,我们需要通过以下命令来检查MySQL服务器是否启动:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ps -ef | grep mysqld
</code></pre></div></div>
<p>如果MySql已经启动,以上命令将输出mysql进程列表, 如果mysql未启动,你可以使用以下命令来启动mysql服务器:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>root@host# cd /usr/bin
./mysqld_safe &
</code></pre></div></div>
<p>如果你想关闭目前运行的 MySQL 服务器, 你可以执行以下命令:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>root@host# cd /usr/bin
./mysqladmin -u root -p shutdown
Enter password: ******
</code></pre></div></div>
<h2 id="mysql-用户设置">MySQL 用户设置</h2>
<h3 id="先登录数据库">先登录数据库</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>root@host# mysql -u root -p
Enter password:*******
mysql> use mysql;
Database changed
</code></pre></div></div>
<h3 id="创建用户">创建用户</h3>
<ul>
<li>创建用户 ls
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mysql> create user ls identified by 'ls123123';
Query OK, 0 rows affected (0.00 sec)
</code></pre></div> </div>
<p>ls是用户名;%表示所有 IP 都可访问;ls123123 是密码</p>
</li>
<li>给用户授权
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mysql> grant all privileges on *.* to ls@'%' identified by 'ls123123';
Query OK, 0 rows affected (0.00 sec)
</code></pre></div> </div>
</li>
<li>释放
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
</code></pre></div> </div>
</li>
</ul>
<h3 id="删除用户">删除用户</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>drop user zhangsan@'%';
</code></pre></div></div>
<p>drop user命令会删除用户以及对应的权限,执行命令后你会发现mysql.user表和mysql.db表的相应记录都消失了。</p>
<h3 id="修改密码">修改密码</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>update mysql.user set password = password('zhangsannew') where user = 'zhangsan' and host = '%';
flush privileges;
</code></pre></div></div>
<h3 id="修改-root-密码">修改 root 密码</h3>
<ul>
<li>用SET PASSWORD命令
首先登录MySQL。
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mysql> set password for root@localhost = password('123');
</code></pre></div> </div>
</li>
<li>用mysqladmin
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mysqladmin -uroot -proot123456 password root123123
</code></pre></div> </div>
</li>
</ul>
<h3 id="常用命令组">常用命令组</h3>
<p>创建用户并授予指定数据库全部权限:适用于Web应用创建MySQL用户</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>create user zhangsan identified by 'zhangsan';
grant all privileges on zhangsanDb.* to zhangsan@'%' identified by 'zhangsan';
flush privileges;
</code></pre></div></div>
<p>创建了用户zhangsan,并将数据库zhangsanDB的所有权限授予zhangsan。如果要使zhangsan可以从本机登录,那么可以多赋予localhost权限:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>grant all privileges on zhangsanDb.* to zhangsan@'localhost' identified by 'zhangsan';
</code></pre></div></div>
<h2 id="etcmycnf-文件配置">/etc/my.cnf 文件配置</h2>
<p>一般情况下,你不需要修改该配置文件,该文件默认配置如下:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
</code></pre></div></div>
<p>在配置文件中,你可以指定不同的错误日志文件存放的目录,一般你不需要改动这些配置。</p>
<h2 id="管理mysql的命令">管理MySQL的命令</h2>
<p>以下列出了使用Mysql数据库过程中常用的命令:</p>
<ul>
<li>USE 数据库名 :
选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mysql> use RUNOOB;
Database changed
</code></pre></div> </div>
</li>
<li>SHOW DATABASES:
列出 MySQL 数据库管理系统的数据库列表。
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| RUNOOB |
| cdcol |
| mysql |
| onethink |
| performance_schema |
| phpmyadmin |
| test |
| wecenter |
| wordpress |
+--------------------+
10 rows in set (0.02 sec)
</code></pre></div> </div>
</li>
<li>SHOW TABLES:
显示指定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库。
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mysql> use RUNOOB;
Database changed
mysql> SHOW TABLES;
+------------------+
| Tables_in_runoob |
+------------------+
| employee_tbl |
| runoob_tbl |
| tcount_tbl |
+------------------+
3 rows in set (0.00 sec)
</code></pre></div> </div>
</li>
<li>SHOW COLUMNS FROM 数据表:
显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mysql> SHOW COLUMNS FROM runoob_tbl;
+-----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+-------+
| runoob_id | int(11) | NO | PRI | NULL | |
| runoob_title | varchar(255) | YES | | NULL | |
| runoob_author | varchar(255) | YES | | NULL | |
| submission_date | date | YES | | NULL | |
+-----------------+--------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
</code></pre></div> </div>
</li>
<li>SHOW INDEX FROM 数据表:显示数据表的详细索引信息,包括PRIMARY KEY(主键)。
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mysql> SHOW INDEX FROM runoob_tbl;
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| runoob_tbl | 0 | PRIMARY | 1 | runoob_id | A | 2 | NULL | NULL | | BTREE | | |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)
</code></pre></div> </div>
</li>
<li>SHOW TABLE STATUS [FROM db_name] [LIKE ‘pattern’] \G:
该命令将输出Mysql数据库管理系统的性能及统计信息。
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># 显示数据库 RUNOOB 中所有表的信息
mysql> SHOW TABLE STATUS FROM RUNOOB;
# 表名以runoob开头的表的信息
mysql> SHOW TABLE STATUS from RUNOOB LIKE 'runoob%';
# 加上 \G,查询结果按列打印
mysql> SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'\G;
</code></pre></div> </div>
</li>
</ul>Edmond.Shi启动及关闭 MySQL 服务器基于CentOS,安装MySql2020-10-15T14:41:00+00:002020-10-15T14:41:00+00:00/db/2020/10/15/mysql-install<p>先记住几个命令</p>
<ul>
<li>mysqld is the server executable (one of them) #服务执行工具</li>
<li>mysql is the command line client # 客户端工具 查询用</li>
<li>mysqladmin is a maintainance or administrative utility # 运维和管理工具</li>
</ul>
<h2 id="安装mysql">安装MySQL</h2>
<h3 id="下载安装包然后使用-yum-安装">下载安装包,然后使用 yum 安装</h3>
<p>在 Centos7 系统下使用 yum 命令安装 MySQL,需要注意的是 CentOS 7 版本中 MySQL数据库已从默认的程序列表中移除,所以在安装前我们需要先去官网下载 Yum 资源包,下载地址为:<a href="https://dev.mysql.com/downloads/repo/yum/">https://dev.mysql.com/downloads/repo/yum/</a></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
yum update
yum install mysql-server
</code></pre></div></div>
<h3 id="权限设置">权限设置</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>chown mysql:mysql -R /var/lib/mysql
</code></pre></div></div>
<h3 id="初始化-mysql">初始化 MySQL</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mysqld --initialize
</code></pre></div></div>
<h3 id="启动-mysql">启动 MySQL</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl start mysqld
</code></pre></div></div>
<h3 id="查看mysql运行状态">查看MySQL运行状态</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl status mysqld
</code></pre></div></div>
<h2 id="验证-mysql-的安装">验证 MySQL 的安装</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[root@host]# mysqladmin --version
</code></pre></div></div>
<p>linux上该命令将输出以下结果,该结果基于你的系统信息:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mysqladmin Ver 8.42 Distrib 5.6.49, for Linux on x86_64
</code></pre></div></div>
<h2 id="使用-mysql-clientmysql客户端-执行简单的sql命令">使用 MySQL Client(Mysql客户端) 执行简单的SQL命令</h2>
<p>你可以在 MySQL Client(Mysql客户端) 使用 mysql 命令连接到 MySQL 服务器上,默认情况下 MySQL 服务器的登录密码为空,所以本实例不需要输入密码。</p>
<p>命令如下:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[root@host]# mysql
</code></pre></div></div>
<p>以上命令执行后会输出 mysql>提示符,这说明你已经成功连接到Mysql服务器上,你可以在 mysql> 提示符执行SQL命令:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.01 sec)
</code></pre></div></div>
<h2 id="mysql安装后需要做的">Mysql安装后需要做的</h2>
<p>Mysql安装成功后,默认的root用户密码为空,你可以使用以下命令来创建root用户的密码:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[root@host]# mysqladmin -u root password "new_password";
</code></pre></div></div>
<p>现在你可以通过以下命令来连接到Mysql服务器:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[root@host]# mysql -u root -p
Enter password:*******
</code></pre></div></div>
<p><strong>注意:</strong> 在输入密码时,密码是不会显示了,你正确输入即可。</p>Edmond.Shi先记住几个命令 mysqld is the server executable (one of them) #服务执行工具 mysql is the command line client # 客户端工具 查询用 mysqladmin is a maintainance or administrative utility # 运维和管理工具一些实用的正则表达式2019-12-21T10:20:00+00:002019-12-21T10:20:00+00:00/javascript/2019/12/21/practical-regular-expressions<h2 id="一些实用的正则表达式">一些实用的正则表达式</h2>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/* 合法uri */</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">validateURL</span><span class="p">(</span><span class="nx">textval</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">urlregex</span> <span class="o">=</span> <span class="sr">/^</span><span class="se">(?:</span><span class="sr">http</span><span class="se">(</span><span class="sr">s</span><span class="se">)?</span><span class="sr">:</span><span class="se">\/\/)?[\w</span><span class="sr">.-</span><span class="se">]</span><span class="sr">+</span><span class="se">(?:\.[\w\.</span><span class="sr">-</span><span class="se">]</span><span class="sr">+</span><span class="se">)</span><span class="sr">+</span><span class="se">[\w\-\.</span><span class="sr">_~:</span><span class="se">/</span><span class="sr">?#[</span><span class="se">\]</span><span class="sr">@!</span><span class="se">\$</span><span class="sr">&'</span><span class="se">\*\+</span><span class="sr">,;=.</span><span class="se">]</span><span class="sr">+$/</span>
<span class="k">return</span> <span class="nx">urlregex</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">textval</span><span class="p">)</span>
<span class="p">}</span>
<span class="cm">/* 小写字母 */</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">validateLowerCase</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">reg</span> <span class="o">=</span> <span class="sr">/^</span><span class="se">[</span><span class="sr">a-z</span><span class="se">]</span><span class="sr">+$/</span>
<span class="k">return</span> <span class="nx">reg</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span>
<span class="p">}</span>
<span class="cm">/* 大写字母 */</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">validateUpperCase</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">reg</span> <span class="o">=</span> <span class="sr">/^</span><span class="se">[</span><span class="sr">A-Z</span><span class="se">]</span><span class="sr">+$/</span>
<span class="k">return</span> <span class="nx">reg</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span>
<span class="p">}</span>
<span class="cm">/* 大小写字母 */</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">validateAlphabets</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">reg</span> <span class="o">=</span> <span class="sr">/^</span><span class="se">[</span><span class="sr">A-Za-z</span><span class="se">]</span><span class="sr">+$/</span>
<span class="k">return</span> <span class="nx">reg</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span>
<span class="p">}</span>
<span class="cm">/* 市场售价 */</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">validatePrice</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">reg</span> <span class="o">=</span> <span class="sr">/</span><span class="se">(</span><span class="sr">^</span><span class="se">[</span><span class="sr">1-9</span><span class="se">]\d</span><span class="sr">*</span><span class="se">(\.\d{1,2})?</span><span class="sr">$</span><span class="se">)</span><span class="sr">|</span><span class="se">(</span><span class="sr">^0</span><span class="se">(\.\d{1,2})?</span><span class="sr">$</span><span class="se">)</span><span class="sr">/</span>
<span class="k">return</span> <span class="nx">reg</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span>
<span class="p">}</span>
<span class="cm">/* 库存预警值 匹配非负整数(正整数 + 0) */</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">validatestockWarn</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">reg</span> <span class="o">=</span> <span class="sr">/^</span><span class="se">(</span><span class="sr">0|</span><span class="se">[</span><span class="sr">1-9</span><span class="se">][</span><span class="sr">0-9</span><span class="se">]</span><span class="sr">*</span><span class="se">)</span><span class="sr">$/</span>
<span class="k">return</span> <span class="nx">reg</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span>
<span class="p">}</span>
<span class="cm">/* 比价网站 只验证京东和苏宁网站 */</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">validateCompareWebsite</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">reg</span> <span class="o">=</span> <span class="sr">/^</span><span class="se">((</span><span class="sr">https</span><span class="se">\:\/\/[</span><span class="sr">0-9a-zA-Z</span><span class="se">\_]</span><span class="sr">+</span><span class="se">\.</span><span class="sr">|http</span><span class="se">\:\/\/[</span><span class="sr">0-9a-zA-Z</span><span class="se">\_]</span><span class="sr">+</span><span class="se">\.</span><span class="sr">|https</span><span class="se">\:\/\/</span><span class="sr">|http</span><span class="se">\:\/\/)</span><span class="sr">|</span><span class="se">([</span><span class="sr">0-9a-zA-Z</span><span class="se">\_]</span><span class="sr">+</span><span class="se">\.){0,1})(</span><span class="sr">jd|suning</span><span class="se">)\.(</span><span class="sr">com$|com</span><span class="se">\/[\S]</span><span class="sr">*</span><span class="se">)</span><span class="sr">/i</span>
<span class="k">return</span> <span class="nx">reg</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span>
<span class="p">}</span>
<span class="cm">/* 固定电话 */</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">validateTelephone</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">reg</span> <span class="o">=</span> <span class="sr">/^</span><span class="se">(\(\d{3,4}\)</span><span class="sr">|</span><span class="se">\d{3,4}</span><span class="sr">-|</span><span class="se">\s)?\d{7,14}</span><span class="sr">$/</span>
<span class="k">return</span> <span class="nx">reg</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span>
<span class="p">}</span>
<span class="cm">/* 手机号码 */</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">validatePhoneNumber</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">reg</span> <span class="o">=</span> <span class="sr">/^</span><span class="se">[</span><span class="sr">1</span><span class="se">][</span><span class="sr">3,4,5,6,7,8,9</span><span class="se">][</span><span class="sr">0-9</span><span class="se">]{9}</span><span class="sr">$/</span>
<span class="k">return</span> <span class="nx">reg</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span>
<span class="p">}</span>
<span class="cm">/* 手机号码和固定电话 */</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">validatePhTelNumber</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">reg</span> <span class="o">=</span> <span class="sr">/^</span><span class="se">((</span><span class="sr">0</span><span class="se">\d{2,3}</span><span class="sr">-</span><span class="se">\d{7,8})</span><span class="sr">|</span><span class="se">(</span><span class="sr">1</span><span class="se">[</span><span class="sr">3456789</span><span class="se">]\d{9}))</span><span class="sr">$/</span>
<span class="k">return</span> <span class="nx">reg</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span>
<span class="p">}</span>
<span class="cm">/* 电子邮箱 */</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">validateEmail</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">reg</span> <span class="o">=</span> <span class="sr">/^</span><span class="se">[</span><span class="sr">A-Za-z0-9</span><span class="se">\u</span><span class="sr">4e00-</span><span class="se">\u</span><span class="sr">9fa5</span><span class="se">]</span><span class="sr">+@</span><span class="se">[</span><span class="sr">a-zA-Z0-9_-</span><span class="se">]</span><span class="sr">+</span><span class="se">(\.[</span><span class="sr">a-zA-Z0-9_-</span><span class="se">]</span><span class="sr">+</span><span class="se">)</span><span class="sr">+$/</span>
<span class="k">return</span> <span class="nx">reg</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span>
<span class="p">}</span>
<span class="cm">/* 邮编 */</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">validateZipCode</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">reg</span> <span class="o">=</span> <span class="sr">/^</span><span class="se">[</span><span class="sr">1-9</span><span class="se">][</span><span class="sr">0-9</span><span class="se">]{5}</span><span class="sr">$/</span>
<span class="k">return</span> <span class="nx">reg</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span>
<span class="p">}</span>
<span class="cm">/* 身份证 */</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">validateIDCard</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">reg</span> <span class="o">=</span> <span class="sr">/</span><span class="se">(</span><span class="sr">^</span><span class="se">\d{15}</span><span class="sr">$</span><span class="se">)</span><span class="sr">|</span><span class="se">(</span><span class="sr">^</span><span class="se">\d{18}</span><span class="sr">$</span><span class="se">)</span><span class="sr">|</span><span class="se">(</span><span class="sr">^</span><span class="se">\d{17}(\d</span><span class="sr">|X|x</span><span class="se">)</span><span class="sr">$</span><span class="se">)</span><span class="sr">/</span>
<span class="k">return</span> <span class="nx">reg</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span>
<span class="p">}</span>
<span class="cm">/* 银行卡号 15位或者16位或者19位 */</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">validateBank</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">reg</span> <span class="o">=</span> <span class="sr">/^</span><span class="se">([</span><span class="sr">1-9</span><span class="se">]{1})(\d{14}</span><span class="sr">|</span><span class="se">\d{18}</span><span class="sr">|</span><span class="se">\d{15})</span><span class="sr">$/</span>
<span class="k">return</span> <span class="nx">reg</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span>
<span class="p">}</span>
<span class="cm">/* 纳税人识别码 */</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">validateTaxpayer</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">reg</span> <span class="o">=</span> <span class="sr">/^</span><span class="se">([</span><span class="sr">1-9</span><span class="se">]{1})(\d{14}</span><span class="sr">|</span><span class="se">\d{18}</span><span class="sr">|</span><span class="se">\d{15})</span><span class="sr">$/</span>
<span class="k">return</span> <span class="nx">reg</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span>
<span class="p">}</span>
<span class="cm">/* 匹配全空格 */</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">validateAllBlank</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">reg</span> <span class="o">=</span> <span class="sr">/^</span><span class="se">\s</span><span class="sr">+$/gi</span>
<span class="k">return</span> <span class="nx">reg</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span>
</code></pre></div></div>Edmond.Shi一些实用的正则表达式使用 nodemon 替代 node 进行开发2019-10-20T17:40:00+00:002019-10-20T17:40:00+00:00/ops/2019/10/20/dev-with-nodemon<h2 id="安装">安装</h2>
<p>可以安装在全局,也可以安装在项目里面,放在 devDependences 里面就行了</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npm <span class="nb">install </span>nodemon <span class="nt">-g</span>
</code></pre></div></div>
<p>或</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npm <span class="nb">install </span>nodemon <span class="nt">--dev</span>
</code></pre></div></div>
<h2 id="最佳实践用过的配置文件">最佳实践,用过的配置文件</h2>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"verbose"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
</span><span class="nl">"debug"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
</span><span class="nl">"exec"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ts-node src/server.ts"</span><span class="p">,</span><span class="w">
</span><span class="nl">"ignore"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="s2">"node_modules"</span><span class="p">,</span><span class="w">
</span><span class="s2">"./test"</span><span class="p">,</span><span class="w">
</span><span class="s2">"**/*.d.ts"</span><span class="p">,</span><span class="w">
</span><span class="s2">"*.test.ts"</span><span class="p">,</span><span class="w">
</span><span class="s2">"*.spec.ts"</span><span class="p">,</span><span class="w">
</span><span class="s2">"fixtures/*"</span><span class="p">,</span><span class="w">
</span><span class="s2">"test/**/*"</span><span class="p">,</span><span class="w">
</span><span class="s2">"docs/*"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"events"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"restart"</span><span class="p">:</span><span class="w"> </span><span class="s2">"rs"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"watch"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="s2">"./src"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"env"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"NODE_ENV"</span><span class="p">:</span><span class="w"> </span><span class="s2">"development"</span><span class="p">,</span><span class="w">
</span><span class="nl">"PORT"</span><span class="p">:</span><span class="w"> </span><span class="s2">"3000"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"ext"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ts"</span><span class="p">,</span><span class="w">
</span><span class="nl">"inspect"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>Edmond.Shi安装使用 pm2 进行远程自动化部署2019-10-19T22:46:00+00:002019-10-19T22:46:00+00:00/ops/2019/10/19/remote-deploy-with-pm2<p>pm2(process manager)是一个进程管理工具,维护一个进程列表,可以用它来管理你的node进程,负责所有正在运行的进程,并查看node进程的状态,也支持性能监控,负载均衡等功能。</p>
<h2 id="pm2-的用处">pm2 的用处</h2>
<ul>
<li>监听文件变化,自动重启程序</li>
<li>支持性能监控</li>
<li>负载均衡</li>
<li>程序崩溃自动重启</li>
<li>服务器重新启动时自动重新启动</li>
<li>自动化部署项目</li>
</ul>
<h2 id="安装">安装</h2>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npm <span class="nb">install </span>pm2 <span class="nt">-g</span>
</code></pre></div></div>
<h2 id="常用命令">常用命令</h2>
<h3 id="启动">启动</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm2 start app.js
</code></pre></div></div>
<h3 id="启动进程并指定应用的程序名">启动进程并指定应用的程序名</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm2 start app.js <span class="nt">--name</span> application1
</code></pre></div></div>
<h3 id="集群模式启动">集群模式启动</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># -i 表示 number-instances 实例数量</span>
<span class="c"># max 表示 PM2将自动检测可用CPU的数量 可以自己指定数量</span>
pm2 start start.js <span class="nt">-i</span> max
</code></pre></div></div>
<h3 id="添加进程监视">添加进程监视</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 在文件改变的时候会重新启动程序</span>
pm2 start app.js <span class="nt">--name</span> start <span class="nt">--watch</span>
</code></pre></div></div>
<h3 id="列出所有进程">列出所有进程</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm2 list
pm2 <span class="nb">ls</span> <span class="c"># 简写</span>
</code></pre></div></div>
<h3 id="删除进程">删除进程</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># pm2 delete [appname] | id</span>
pm2 delete app <span class="c"># 指定进程名删除</span>
pm2 delete 0 <span class="c"># 指定进程id删除</span>
pm2 delete all <span class="c"># 删除所有进程</span>
</code></pre></div></div>
<h3 id="查看某个进程的详细情况">查看某个进程的详细情况</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm2 describe app
</code></pre></div></div>
<h3 id="重新启动">重新启动</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm2 restart app.js
</code></pre></div></div>
<h3 id="查看进程的资源消耗情况">查看进程的资源消耗情况</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm2 monit
</code></pre></div></div>
<h3 id="查看进程日志">查看进程日志</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm2 logs app <span class="c"># 查看该名称进程的日志</span>
pm2 logs all <span class="c"># 查看所有进程的日志</span>
</code></pre></div></div>
<h3 id="设置开机启动">设置开机启动</h3>
<p>开启启动设置,此处是CentOS系统,其他系统替换最后一个选项(可选项:ubuntu, centos, redhat, gentoo, systemd, darwin, amazon)</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm2 startup centos
</code></pre></div></div>
<p>然后按照提示需要输入的命令进行输入</p>
<p>最后保存设置</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm2 save
</code></pre></div></div>
<h2 id="远程部署">远程部署</h2>
<h3 id="准备工作">准备工作</h3>
<ul>
<li>服务器安装 pm2</li>
<li>服务器安装并配置 git, 确保可以从指定的 repo 拉取到最新的代码</li>
<li>可以免密登录到服务器(这个不是必须的, 但是实际工作中,必然要设置, 不然每次部署都要输入好几次密码, 会疯掉的)</li>
</ul>
<h3 id="pm2-的远程部署配置">pm2 的远程部署配置</h3>
<p>详细配置可参考<a href="http://pm2.keymetrics.io/docs/usage/deployment/">官方文档-deploy</a>
ecosystem.json</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"apps"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lottery-api"</span><span class="p">,</span><span class="w">
</span><span class="nl">"script"</span><span class="p">:</span><span class="w"> </span><span class="s2">"dist/server.js"</span><span class="p">,</span><span class="w">
</span><span class="nl">"env"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"COMMON_VARIABLE"</span><span class="p">:</span><span class="w"> </span><span class="s2">"true"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"env_production"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"NODE_ENV"</span><span class="p">:</span><span class="w"> </span><span class="s2">"production"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"deploy"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"production"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"user"</span><span class="p">:</span><span class="w"> </span><span class="s2">"root"</span><span class="p">,</span><span class="w">
</span><span class="nl">"host"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="s2">"xxx.xxx.xxx.xxx"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"port"</span><span class="p">:</span><span class="w"> </span><span class="mi">22</span><span class="p">,</span><span class="w">
</span><span class="nl">"ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">"origin/master"</span><span class="p">,</span><span class="w">
</span><span class="nl">"repo"</span><span class="p">:</span><span class="w"> </span><span class="s2">"git@gitee.com:shiquan/lottery-api.git"</span><span class="p">,</span><span class="w">
</span><span class="nl">"ssh_options"</span><span class="p">:</span><span class="w"> </span><span class="s2">"StrictHostKeyChecking=no"</span><span class="p">,</span><span class="w">
</span><span class="nl">"path"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/root/workspace/lottery/lottery-api"</span><span class="p">,</span><span class="w">
</span><span class="nl">"pre-deploy"</span><span class="p">:</span><span class="w"> </span><span class="s2">"git fetch --all "</span><span class="p">,</span><span class="w">
</span><span class="nl">"post-deploy"</span><span class="p">:</span><span class="w"> </span><span class="s2">"npm install && pm2 startOrRestart ecosystem.json --env production"</span><span class="p">,</span><span class="w">
</span><span class="nl">"env"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"NODE_ENV"</span><span class="p">:</span><span class="w"> </span><span class="s2">"production"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>首次部署</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm2 deploy deploy.yaml production setup
</code></pre></div></div>
<p>部署完成后,既可登陆服务器查看配置的目录下是否从git上拉取了项目</p>
<p>再次部署</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm2 deploy deploy.yaml production upddate
</code></pre></div></div>
<p>这种操作也适合前端代码部署</p>Edmond.Shipm2(process manager)是一个进程管理工具,维护一个进程列表,可以用它来管理你的node进程,负责所有正在运行的进程,并查看node进程的状态,也支持性能监控,负载均衡等功能。Nginx 在 ContOS7 上的使用2019-10-19T18:21:00+00:002019-10-19T18:21:00+00:00/ops/2019/10/19/use-nginx-on-centos7<p>Nginx 读作 engine x, 是一个免费的、开源的、高性能的 HTTP 和反向代理服务,主要负责负载一些访问量比较大的站点。</p>
<p>Nginx 可以作为一个独立的 Web 服务,也可以用来给 Apache 或是其他的 Web 服务做反向代理。</p>
<p>相比于 Apache,Nginx 可以处理更多的并发连接,而且每个连接的内存占用的非常小。</p>
<h2 id="安装">安装</h2>
<p>yum 库中没有 nginx 的安装包,但是 epel 中有,所以我们先安装 epel</p>
<p>下面所有操作都默认使用 root 账户操作</p>
<h3 id="安装-epel">安装 epel</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yum <span class="nt">-y</span> <span class="nb">install </span>epel-release
</code></pre></div></div>
<h3 id="安装-nginx">安装 nginx</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yum <span class="nt">-y</span> <span class="nb">install </span>nginx
</code></pre></div></div>
<h3 id="nginx-常用操作">nginx 常用操作</h3>
<h4 id="设置开机启动">设置开机启动</h4>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl <span class="nb">enable </span>nginx
</code></pre></div></div>
<h4 id="关闭开机启动">关闭开机启动</h4>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl disable nginx
</code></pre></div></div>
<h4 id="启动-nginx">启动 nginx</h4>
<pre><code class="language-bahs">systemctl start nginx
</code></pre>
<h4 id="停止-nginx">停止 nginx</h4>
<pre><code class="language-bahs">systemctl stop nginx
</code></pre>
<h4 id="重启-nginx">重启 nginx</h4>
<pre><code class="language-bahs">systemctl restart nginx
</code></pre>
<h4 id="修改-nginx-配置后重新加载">修改 nginx 配置后,重新加载</h4>
<pre><code class="language-bahs">systemctl reload nginx
</code></pre>
<h4 id="检查-nginx-的运行状态">检查 nginx 的运行状态</h4>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl status nginx
</code></pre></div></div>
<p>然后会输出类似如下内容:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded <span class="o">(</span>/usr/lib/systemd/system/nginx.service<span class="p">;</span> disabled<span class="p">;</span> vendor preset: disabled<span class="o">)</span>
Active: active <span class="o">(</span>running<span class="o">)</span> since Sat 2019-10-19 18:30:38 CST<span class="p">;</span> 9s ago
Process: 19120 <span class="nv">ExecStart</span><span class="o">=</span>/usr/sbin/nginx <span class="o">(</span><span class="nv">code</span><span class="o">=</span>exited, <span class="nv">status</span><span class="o">=</span>0/SUCCESS<span class="o">)</span>
Process: 19118 <span class="nv">ExecStartPre</span><span class="o">=</span>/usr/sbin/nginx <span class="nt">-t</span> <span class="o">(</span><span class="nv">code</span><span class="o">=</span>exited, <span class="nv">status</span><span class="o">=</span>0/SUCCESS<span class="o">)</span>
Process: 19116 <span class="nv">ExecStartPre</span><span class="o">=</span>/usr/bin/rm <span class="nt">-f</span> /run/nginx.pid <span class="o">(</span><span class="nv">code</span><span class="o">=</span>exited, <span class="nv">status</span><span class="o">=</span>0/SUCCESS<span class="o">)</span>
Main PID: 19122 <span class="o">(</span>nginx<span class="o">)</span>
CGroup: /system.slice/nginx.service
├─19122 nginx: master process /usr/sbin/nginx
└─19123 nginx: worker process
</code></pre></div></div>
<h3 id="打开相应的服务器端口">打开相应的服务器端口</h3>
<p>如果你的服务器开启了防火墙,则需要同时打开 80(HTTP)和 443(HTTPS)端口</p>
<p>通过下面的命令来打开这两个端口:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>firewall-cmd <span class="nt">--permanent</span> <span class="nt">--zone</span><span class="o">=</span>public <span class="nt">--add-service</span><span class="o">=</span>http
firewall-cmd <span class="nt">--permanent</span> <span class="nt">--zone</span><span class="o">=</span>public <span class="nt">--add-service</span><span class="o">=</span>https
firewall-cmd <span class="nt">--reload</span>
</code></pre></div></div>
<h3 id="验证-nginx-是否成功启动">验证 nginx 是否成功启动</h3>
<p>打开 <a href="http://服务器IP,">http://服务器IP,</a> 如果显示默认的 nginx 欢迎页, 表示已经启动成功</p>
<p><img src="/assets/img/nginx_welcome_page.png" alt="nginx 欢迎页" /></p>
<h3 id="nginx-端口转发">nginx 端口转发</h3>
<p>只记一个最实用的例子,将 domain/api/ 转发到 domain:3000</p>
<div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">server</span> {
<span class="n">listen</span> <span class="m">8080</span>;
<span class="n">server_name</span> <span class="n">localhost</span>;
<span class="n">location</span> / {
<span class="n">root</span> <span class="n">html</span>/;
<span class="n">index</span> <span class="n">index</span>.<span class="n">html</span> <span class="n">index</span>.<span class="n">htm</span>;
}
<span class="n">location</span> ^~/<span class="n">api</span>/ {
<span class="n">rewrite</span> ^/<span class="n">api</span>/(.*)$ /$<span class="m">1</span> <span class="n">break</span>;
<span class="n">proxy_pass</span> <span class="n">http</span>://<span class="m">127</span>.<span class="m">0</span>.<span class="m">0</span>.<span class="m">1</span>:<span class="m">3000</span>;
}
}
</code></pre></div></div>
<h3 id="nginx-配置文件和最佳实践">nginx 配置文件和最佳实践</h3>
<ul>
<li>通过以上方式安装的 Nginx,所有相关的配置文件都在 /etc/nginx/ 目录中。</li>
<li>Nginx 的主配置文件是 /etc/nginx/nginx.conf。
为了使 Nginx 配置更易于维护,建议为每个服务(域名)创建一个单独的配置文件。</li>
<li>每一个独立的 Nginx 服务配置文件都必须以 .conf 结尾,并存储在 /etc/nginx/conf.d 目录中。您可以根据需求,创建任意多个独立的配置文件。</li>
<li>独立的配置文件,建议遵循以下命名约定,比如你的域名是 kaifazhinan.com,那么你的配置文件的应该是这样的 /etc/nginx/conf.d/kaifazhinan.com.conf,如果你在一个服务器中部署多个服务,当然你也可以在文件名中加上 Nginx 转发的端口号,比如 kaifazhinan.com.3000.conf,这样做看起来会更加友好。
如果你的配置中有很多重复的代码,那么建议你创建一个 /etc/nginx/snippets 文件夹,在这里面存放所有会被复用的代码块,然后在各个需要用到的 Nginx 的配置文件中引用进去,这样可以更方便管理和修改。</li>
<li>Nginx 日志文件(access.log 和 error.log )位于 /var/log/nginx/ 目录中。建议为每个独立的服务配置不同的访问权限和错误日志文件,这样查找错误时,会更加方便快捷。</li>
<li>
<p>你可以将要部署的代码文件,存储在任何你想的位置,但是一般推荐存放在下列位置中的其中一个:</p>
<ul>
<li>/home/<user_name>/<site_name></site_name></user_name></li>
<li>/var/www/<site_name></site_name></li>
<li>/var/www/html/<site_name></site_name></li>
<li>/opt/<site_name></site_name></li>
<li>/usr/share/nginx/html</li>
</ul>
</li>
</ul>Edmond.ShiNginx 读作 engine x, 是一个免费的、开源的、高性能的 HTTP 和反向代理服务,主要负责负载一些访问量比较大的站点。