【建立Web应用环境】创建GCP实例~启动Web应用

首先

由于是第二次在GCP上进行投资组合的环境构建,我们将预期未来继续进行,并将整个流程总结为备忘录。

虽然这是一篇拙作,但如果能对某些人有所帮助,我会感到幸福。

投资组合
第二个投资组合

整个流程

将Spring编译成war文件后,在GCP上生成的CentOS环境中搭建Tomcat和mariadb来运行。

    • GCPのインスタンス生成

 

    • Tomcatインストール

 

    • ポートフォワーディングの設定

 

    • mariadbインストール

 

    • タイムゾーンの設定

 

    セッションタイムアウトの設定

创建GCP实例

安装时的各种设置(免费配额,操作系统,防火墙,网络等)
设置用户密码并配置为可以使用SSH登录

参考资料:
2023年版的Google Cloud免费额度是真的不会收费吗?的验证

1.png
2.png
3.png
4.png
5.png
6.png

详细选项

如果要设置静态外部IP

10.png
11.png
12.png
13.png
14.png
15.png

如果使用TeraTerm等工具进行SSH通信的情况

7.png
8.png
9.png
16.png
17.png

安装JDK17

参考:请使用sudo命令按以下步骤执行:
在CentOS 7上安装OpenJDK 17(Azul Zulu Builds of OpenJDK)。

安装Tomcat

参考:在CentOS 7上安装Apache Tomcat 9的步骤
安装完Apache Tomcat后,立即需要进行的安全配置。

为了运行Tomcat,我们将添加一个专用用户tomcat。

# useradd -s /sbin/nologin tomcat

下载 Apache Tomcat 10 的主程序,以 tar.gz 格式。
(尽管当前最新版本是11,但是由于 Web 应用程序的开发环境是10,因此选择使用这个版本)

# cd ~
# curl -O http://ftp.riken.jp/net/apache/tomcat/tomcat-10/v10.1.13/bin/apache-tomcat-10.1.13.tar.gz

使用tar命令解压下载的tar.gz文件,并将其放置在/opt目录下。
另外,将解压后的Apache Tomcat的所有权分配给已创建的tomcat用户。

$ tar -xzvf ~/apache-tomcat-10.1.13.tar.gz
$ sudo mv ~/apache-tomcat-10.1.13 /opt
$ sudo chown -R tomcat:tomcat /opt/apache-tomcat-10.1.13

先把 Apache Tomcat 10 作为服务进行注册。
首先新建 /etc/systemd/system/tomcat.service 文件,
按照以下方式进行描述并保存。

$ sudo vi /etc/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat 10
After=network.target

[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/opt/apache-tomcat-10.1.13/tomcat.pid
RemainAfterExit=yes

ExecStart=/opt/apache-tomcat-10.1.13/bin/startup.sh
ExecStop=/opt/apache-tomcat-10.1.13/bin/shutdown.sh
ExecReStart=/opt/apache-tomcat-10.1.13/bin/shutdown.sh;/opt/apache-tomcat-10.1.13/bin/startup.sh

[Install]
WantedBy=multi-user.target

将所创建的定义文件权限更改为 755。

$ sudo chmod 755 /etc/systemd/system/tomcat.service

在创建定义文件后,使用systemctl enable命令来启用服务。

$ sudo systemctl enable tomcat

让我们尝试启动Apache Tomcat 10。
如果显示为”active”,则表示OK。

$ sudo systemctl start tomcat
$ sudo systemctl status tomcat

● tomcat.service - Apache Tomcat 10
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (exited) 

为了设置防火墙,我们将停止一次。

$ sudo systemctl stop tomcat

配置Firewalld以启用端口8080。
在/etc/firewalld/services/文件夹中创建tomcat.xml文件。

$ sudo vi /etc/firewalld/services/tomcat.xml

//下記内容をコピペ
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Apache Tomcat 10</short>
  <description>Apache Tomcat 10</description>
  <port protocol="tcp" port="8080"/>
</service>

可以通过firewall-cmd命令来确认Firewalld目前允许通信的服务。确认后可以看到dhcpv6-client和ssh服务是被允许的。

$ sudo firewall-cmd --list-services --zone=public --permanent
dhcpv6-client ssh

为了允许Tomcat通信,执行以下防火墙命令firewall-cmd。

$ sudo firewall-cmd --add-service=tomcat --zone=public --permanent
$ sudo firewall-cmd --reload

もう一度、現在通信を許可しているサービスを確認すると、
今度は tomcat が追加されたことが確認できます。

$ sudo firewall-cmd --list-services --zone=public --permanent
dhcpv6-client ssh tomcat

以下不需要做也可以。

在Tomcat的主目录下的conf/web.xml(如果只想为特定应用程序进行设置,则需要在应用程序内的web.xml中进行设置),使用标签来列举要拒绝的方法,除了GET和POST之外的方法。

## 以下をコピペ
<security-constraint>
    <web-resource-collection>
        <web-resource-name>deny method</web-resource-name>
        <url-pattern>/*</url-pattern>
        <http-method>HEAD</http-method>
        <http-method>PUT</http-method>
        <http-method>DELETE</http-method>
        <http-method>OPTIONS</http-method>
        <http-method>TRACE</http-method>
        <http-method>CONNECT</http-method>
        <http-method>PATCH</http-method>
        <http-method>PROPFIND</http-method>
        <http-method>PROPPATCH</http-method>
        <http-method>MKCOL</http-method>
        <http-method>COPY</http-method>
        <http-method>MOVE</http-method>
        <http-method>LOCK</http-method>
        <http-method>UNLOCK</http-method>
    </web-resource-collection>
    <auth-constraint/>
</security-constraint>

将war文件放置在 apatch-tomcat/webapps 目录下。
重启tomcat。

$ sudo systemctl restart tomcat

如果能够访问,就完成了。

端口转发的设置

由于我的环境无法将Tomcat配置为80端口,所以我将通过端口转发来模拟接收80端口的访问。

参考:
使用firewalld进行端口转发。

正在将80端口的访问转发到8080端口。

$ sudo firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
#設定の永久化
$ sudo firewall-cmd --runtime-to-permanent

现在可以通过IP地址或域名直接登录了。

MariaDB 是一个开源的关系型数据库管理系统,旨在提供高性能、可靠性和安全性。它是 MySQL 的一个分支,基于社区的合作与贡献不断发展壮大。MariaDB 提供了许多新功能和改进,使其成为一种强大的数据库解决方案。

参考资料:
在适用于初学者的 CentOS7.9 上安装 MariaDB 10.6
下载 MariaDB 服务器(官方版)

按照公式的步骤进行操作。

首先创建一个仓库。

$ sudo vi /etc/yum.repos.d/MariaDB.repo

#以下内容コピペ

# MariaDB 11.1 CentOS repository list - created 2023-08-29 12:25 UTC
# https://mariadb.org/download/
[mariadb]
name = MariaDB
# rpm.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.
# baseurl = https://rpm.mariadb.org/11.1/centos/$releasever/$basearch
baseurl = https://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/yum/11.1/centos/$releasever/$basearch
module_hotfixes = 1
# gpgkey = https://rpm.mariadb.org/RPM-GPG-KEY-MariaDB
gpgkey = https://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck = 1

开始安装Mariadb。

$ sudo yum install MariaDB-server MariaDB-client

#ひたすらyを押して、以下が出たら完了
Replaced:
  mariadb-libs.x86_64 1:5.5.68-1.el7

Complete!

运行MariaDB。

$ sudo systemctl enable mariadb
$ sudo systemctl start mariadb
$ sudo systemctl status mariadb

#以下表示ならOK
Active: active (running)

进行Mariadb的最基本设置。

$ sudo mariadb -u root -p
Enter password: #そのままEnterキーを押す

#パスワードを設定
mariaDB[(none)]> ALTER USER 'root'@'localhost' IDENTIFIED BY "ここにパスワードを設定";

接下来只需要构建用于Web应用程序的数据库。

时区设置

在CentOS 8、7上更改时区为日本标准时间(JST)。

在我创建的 Web 应用程序中,有一个显示日期和时间的功能。因此,我将 Linux 的时区更改为东京。

使用timedatectl命令将时区设置为东京。

$ sudo timedatectl set-timezone Asia/Tokyo
$ sudo timedatectl status

#以下が出力される
      Local time: Wed 2023-08-30 16:30:52 JST
  Universal time: Wed 2023-08-30 07:30:52 UTC
        RTC time: Wed 2023-08-30 07:30:52
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

重启Mariadb以更新时区。

$ sudo systemctl restart mariadb
$ mariadb -u root -p

MariaDB [(none)]> select @@time_zone; select @@system_time_zone;
+-------------+
| @@time_zone |
+-------------+
| SYSTEM      |
+-------------+
1 row in set (0.000 sec)

+--------------------+
| @@system_time_zone |
+--------------------+
| JST                |
+--------------------+
1 row in set (0.000 sec)

我成功将时间更改为JST。

闲言

500错误的实例

由于运行Web应用程序时出现了500错误,因此我将提供一个案例。

最初,应该查看哪个日志比较好?
小写字母和大写字母的统一
org.springframework.jdbc.BadSqlGrammarException: 
PreparedStatementCallback; bad SQL grammar [SELECT NAME FROM USER WHERE NAME = ?]
...
Caused by: java.sql.SQLSyntaxErrorException:
(conn=31) Table 'learning_stopwatch.USER' doesn't exist

尽管数据库中的所有定义都以小写字母进行,但Java的SQL查询有部分指示以大写字母表示。修正为小写字母后,查询成功运行。

文字编码

参考:
在MySQL创建表后,将字符编码设置更改为utf8mb4来描述。

o.m.jdbc.message.server.ErrorPacket:
Error:1366-22007:Incorrect string value:'\xE5\xAE\x8C\xE6\x88\x90...' for column

如果插入的字符串与支持的字符编码不匹配,那么似乎会显示错误。

我试试查看Mariadb的字符编码。

MariaDB [(none)]> SHOW VARIABLES LIKE 'chara%';
+--------------------------+------------------------------+
| Variable_name            | Value                        |
+--------------------------+------------------------------+
| character_set_client     | utf8mb3                      |
| character_set_connection | utf8mb3                      |
| character_set_database   | latin1                       |
| character_set_filesystem | binary                       |
| character_set_results    | utf8mb3                      |
| character_set_server     | latin1                       |
| character_set_system     | utf8mb3                      |
| character_sets_dir       | /usr/share/mariadb/charsets/ |
+--------------------------+------------------------------+

与客户相关的部分可以概括为以下三个方面。由于全部都是UTF-8编码,所以应该没有问题。

客户端字符集是在从客户端发送SQL语句等时使用的字符编码。

字符集连接
将从客户端接收到的字符进行转换的字符编码

结果字符集用于向客户端发送结果时所使用的字符编码

接下来,我们来确认数据库和表的字符编码和排序顺序。

#データベース
MariaDB [(none)]> 
SELECT SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME 
FROM INFORMATION_SCHEMA.SCHEMATA 
WHERE SCHEMA_NAME = 'learning_stopwatch';

+--------------------+----------------------------+------------------------+
| SCHEMA_NAME        | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+--------------------+----------------------------+------------------------+
| learning_stopwatch | latin1                     | latin1_swedish_ci      |
+--------------------+----------------------------+------------------------+

#テーブル
MariaDB [(none)]> 
SELECT TABLE_NAME,TABLE_COLLATION
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='learning_stopwatch';
+---------------------+-------------------+
| TABLE_NAME          | TABLE_COLLATION   |
+---------------------+-------------------+
| daily_learning_time | latin1_swedish_ci |
| user                | latin1_swedish_ci |
+---------------------+-------------------+

数据库和表的字符编码是Latin1,对吧。

如果我再次确认一下MariaDB的字符编码,
从客户端接收到的字符编码是utf8mb3,
但数据库的字符编码是latin1。
如果将数据库的字符编码更改为utf8mb3,它应该就可以工作了。

MariaDB [(none)]> SHOW VARIABLES LIKE 'chara%';
+--------------------------+------------------------------+
| Variable_name            | Value                        |
+--------------------------+------------------------------+
| character_set_client     | utf8mb3                      |
| character_set_connection | utf8mb3                      |
| 'character_set_database' | 'latin1'                     |
| character_set_filesystem | binary                       |
| character_set_results    | utf8mb3                      |
| character_set_server     | latin1                       |
| character_set_system     | utf8mb3                      |
| character_sets_dir       | /usr/share/mariadb/charsets/ |
+--------------------------+------------------------------+

我将更改数据库和表的字符编码。

#まずはデータベースから変更
MariaDB [(none)]> 
ALTER DATABASE learning_stopwatch
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;

Query OK, 1 row affected (0.035 sec)

MariaDB [(none)]> 
SELECT SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME     
FROM IMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'learning_stopwatch';
+--------------------+----------------------------+------------------------+
| SCHEMA_NAME        | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+--------------------+----------------------------+------------------------+
| learning_stopwatch | utf8mb4                    | utf8mb4_general_ci     |
+--------------------+----------------------------+------------------------+
#つづいてテーブルを変更
MariaDB [learning_stopwatch]>
ALTER TABLE user
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;

Query OK, 1 row affected (0.217 sec)
Records: 1  Duplicates: 0  Warnings: 0

MariaDB [learning_stopwatch]>
ALTER TABLE daily_learning_time
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;

Query OK, 0 rows affected (0.029 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [learning_stopwatch]>
SELECT TABLE_NAME,TABLE_COLLATION
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='learning_stopwatch';
+---------------------+--------------------+
| TABLE_NAME          | TABLE_COLLATION    |
+---------------------+--------------------+
| user                | utf8mb4_general_ci |
| daily_learning_time | utf8mb4_general_ci |
+---------------------+--------------------+

这下已经正常运行了。

设置会话超时时间

参考:Spring Boot – 设置会话超时时间的方法

如果是战争建筑的情况下

创建并配置web.xml文件。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    version="4.0">

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

</web-app>

可以在TOMCAT_HOME/conf/web.xml中设置应用服务器的默认会话超时时间。然而,大多数情况下,我认为更希望为每个应用程序单独设置会话超时时间。在这种情况下,您需要在应用程序项目的src/main/webapp/WEB-INF/web.xml中创建文件。

最后

如果能对某人有所帮助就感到幸福。

广告
将在 10 秒后关闭
bannerAds