批量关停azure vm
重要要点
在这篇文章中,我将向您展示如何:
- 从GitHub检索一个简单的Spring Boot Java App
- 将其连接到Azure Database for MySQL Service
- 设置在Microsoft Azure上运行WildFly的Linux VM
- 将示例应用程序部署到WildFly服务器。
最近,有人要求我在Microsoft Azure上构建一个在WildFly应用程序平台上运行并连接到云中MySQL数据库的演示站点。 前提看起来很简单,但是实现起来可能很棘手,并且关于如何设置类似内容的文档非常有限。 我花了很多时间来确定需要做些什么才能做到这一点,我在这里分享了步骤。
请注意,我将Nginx用作反向代理服务器,因为它比将WildFly发行版中的二进制文件转换为使用VM IP地址要容易得多。 使用Nginx,我可以在内部使用http://127.0.0.1保留WildFly发行版二进制文件。 这还允许在云环境中更轻松地对WildFly进行集群和扩展。
(点击图片放大)
先决条件:
- 一个Azure帐户( 在这里免费试用 )
- 一个Git客户
- Azure CLI 2.0
- Java 7 JDK或更高版本
克隆GitHub示例
在命令提示符下,导航到工作目录并克隆样本存储库 。
git clone https://github.com/bbenz/spring-boot-todo
配置应用程序以使用MySQL数据库
通过命令行验证您的Azure帐户凭据
对于这些步骤,您将需要一个Azure帐户。 您可以在这里免费试用 。 为确保您已登录到Azure帐户,请输入az account list
。 如果您尚未登录,请键入az login
并按照提示进行操作。
使用Azure CLI创建Azure MySQL数据库
接下来,让我们使用Azure CLI 为MySQL实例创建Azure数据库 。 我们将在终端窗口中使用Azure CLI 2.0创建资源组和MySQL实例。
在Mac,Linux和Windows上, Azure命令行界面 (CLI)是一种从命令行利用Azure强大功能的好方法。 它是POSIX兼容的,用Python编写,开源可在GitHub上获得 。 CLI在Mac和Linux的终端窗口中运行,在Windows上,您可以通过命令提示符或Windows的Linux子系统( Windows上的 AKA Bash)访问CLI。 甚至还有一个具有IOS和Android的CLI功能的应用程序 。
您还可以仅通过浏览器从azure门户或shell.azure.com访问Azure CLI以及许多其他CLI。 您可以在此处找到有关我们的Shell的更多信息,以及有关受支持的合作伙伴CLI的更新信息 。 请注意,所有选项都需要一个Microsoft Azure帐户( 在此处免费试用 )。
登录并创建资源组
使用az login命令登录到您的Azure订阅,然后按照屏幕上的说明进行操作。
创建一个Azure资源组。
Azure资源组作为一个单元一起管理Azure服务。 每个资源组必须具有一个位置。 要查看可用于`--location`
所有可能值,请使用az appservice list-locations
命令。
下面的示例在北欧地区中创建一个Azure资源组。
az group create --name myResourceGroup --location "North Europe"
创建一个MySQL服务器
在Azure数据库中为MySQL创建服务器。 替换您自己的唯一MySQL服务器名称,在其中看到`<mysql_server_name>`
占位符。 该名称是MySQL服务器主机名`<mysql_server_name>.mysql.database.azure.com`
,因此它必须是全局唯一的。 另外,用您自己的值替换`<admin_user>`
和`<admin_password>`
:
az mysql server create --name <mysql_server_name> --resource-group myResourceGroup --location "North Europe" --admin-user <admin_user> --admin-password <admin_password>
配置MySQL防火墙
使用az mysql server firewall-rule create命令为MySQL服务器创建防火墙规则,以允许客户端连接。 这是一个为大量IP地址创建防火墙规则的示例(您可能希望缩小实际的防火墙IP地址范围):
az mysql server firewall-rule create --name allIPs --server <mysql_server_name> --resource-group myResourceGroup --start-ip-address 0.0.0.0 --end-ip-address 255.255.255.255
配置Azure MySQL数据库
使用您先前为` <admin_user>
`和`<mysql_server_name>`
指定的值连接到MySQL服务器。
mysql -u <admin_user>@<mysql_server_name> -h <mysql_server_name>.mysql.database.azure.com -P 3306 -p
在“ mysql”提示符下,为待办事项创建一个数据库和一个表。
CREATE DATABASE tododb;
创建一个数据库用户,并在`tododb`数据库中为其赋予所有特权。 将占位符`<Javaapp_user>`
和`<Javaapp_password>`
替换为您自己的唯一应用程序名称:
CREATE USER '<Javaapp_user>' IDENTIFIED BY '<Javaapp_password>';
GRANT ALL PRIVILEGES ON tododb.* TO '<Javaapp_user>';
键入“ quit”退出服务器连接。
更新application.properties文件中的值
在src/main/resources/application.properties:
更新以下值src/main/resources/application.properties:
spring.datasource.url=jdbc:mysql:// >@<mysql_server_name>.mysql.database.azure.com:3306/tododb
spring.datasource.username=adminname@<mysql_server_name>
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
生成并运行示例
使用回购中包含的Maven包装器在本地构建并运行示例:
mvn软件包spring-boot:run
在浏览器中,打开http://localhost:8080
以确保应用程序正常运行,然后再将程序包发送到Azure上的VM。
配置Maven以生成.WAR文件
要将应用程序部署到vm,我们需要使用mvn package命令部署.war文件。 现在,maven会生成一个.jar文件,我们需要将.WAR文件部署到Firefly。 它; 一个简单的更改–只需将以下行添加到pom.xml中:
<packaging>war</packaging>
现在,从与pom.xml相同的位置运行mvn clean package
,以在目标目录中生成一个名为Todo todo-app-java-on-azure-1.0-SNAPSHOT.war
的.WAR文件。
在Azure上创建Linux VM
有多种方法可以在Azure上创建新的Linux VM,对于本文,我们将使用az vm
create
命令来使用命令行。
此命令使用azure上可用的最新Ubuntu映像创建Linux VM:
az vm create -n <vm name> -g <resource group> -l eastus2 --generate-ssh-key --image ubuntults
打开端口8080和9990
接下来,在目标VM上打开端口8080和9990。 Spring Boot将8080端口用于应用程序,而wildfly将9990端口用于管理员访问。 当您在VM上打开多个端口时,必须设置优先级,因此将wildfly设置为比Spring(默认为100)低(我使用了800)。 优先级的范围可以从100到4096。
az vm open-port -n <vm name> -g <resource group> --port 8080
az vm open-port -n <vm name> -g <resource group> --port 9990 –priority 800
SSH进入虚拟机
使用在az vm create命令中生成的SSH密钥进入VM。 在虚拟机中使用<username>
-@左侧的帐户电子邮件通常是默认值。
ssh <username>@< PublicIpAddress>
您应该在第一时间得到此回复。 说是。
The authenticity of host '< PublicIpAddress> (< PublicIpAddress>)' can't be established.
ECDSA key fingerprint is …………
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added < PublicIpAddress> (ECDSA) to the list of known hosts.
准备虚拟机
更新并安装OpenJDK和Nginx
既然我们已经在虚拟机中,那么请确保我们拥有可用的最新Linux,然后安装我们将需要的软件。 在此演示中,我们将nginx安装为反向代理,并配置wildfly作为服务运行。 我们还需要Java,因此我们要安装OpenJDK 8。
使用nginx意味着wildfly服务器可以使用其配置的默认值(127.0.0.1)在任何VM上运行。 否则,我们必须使用您的VM的公共IP地址配置wildfly。 在群集或容器化的环境中,这使得没有nginx的野蝇变得不灵活。 对于演示环境,这意味着我们可以跳过一些配置步骤(已经足够了)。
apt-get update
apt-get install -y openjdk-8*
apt-get install nginx
安装并设置Wildfly即服务
接下来,让我们安装和配置wildfly。 没有适用于wildfly的apt-get,因此我们需要使用wget从服务器检索它
wget http://download.jboss.org/wildfly/12.0.0.Final/wildfly-12.0.0.Final.tar.gz
mv wildfly-12.0.0.Final.tar.gz /opt/
cd /opt/
tar -zvxf wildfly-12.0.0.Final.tar.gz
mv wildfly-12.0.0.Final wildfly
现在,我们在所需的位置放有Wildfly,我们需要添加一个Management用户来处理管理任务:
cd wildfly/bin
./add-user.sh
这是您将看到的提示以及我提供的答案:
What type of user do you wish to add?
a) Management User (mgmt-users.properties)
b) Application User (application-users.properties)
(a): a
Enter the details of the new user to add.
Using realm 'ManagementRealm' as discovered from the existing property files.
Username :
Password : !
What groups do you want this user to belong to? (Please enter a comma separated list, or leave blank for none)[ ]:
About to add user 'rhsotdemo1' for realm 'ManagementRealm'
Is this correct yes/no? yes
Is this new user going to be used for one AS process to connect to another AS process?
eg for a slave host controller connecting to the master or for a Remoting connection for server to server EJB calls.
yes/no? no
接下来,我们将在Widfly中配置一些有关运行VM的信息:
cd /opt/wildfly/bin/
vi standalone.conf
添加或编辑以下内容:
JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"
JBOSS_HOME="/opt/wildfly"
配置Wildfly自动启动
通过添加以下文件,将wildfly配置为在VM启动(或重新启动)时自动启动:
vi /etc/default/wildfly
将此添加到新文件:
WILDFLY_USER="wildfly"
STARTUP_WAIT=180
SHUTDOWN_WAIT=30
WILDFLY_CONFIG=standalone.xml
WILDFLY_MODE=standalone
WILDFLY_BIND=0.0.0.0
保存该文件,然后创建此文件:
vi /opt/wildfly/bin/launch.sh
将此添加到新文件:
#!/bin/sh
if [ "x$WILDFLY_HOME" = "x" ]; then
WILDFLY_HOME=/opt/wildfly
fi
if [ "x$1" = "xdomain" ]; then
echo 'Starting wildfly in domain mode.'
$WILDFLY_HOME/bin/domain.sh -c $2 -b $3
else
echo 'Starting wildfly in standalone mode.'
$WILDFLY_HOME/bin/standalone.sh -c $2 -b $3
fi
保存该文件:
使启动脚本可执行:
chmod 755 /opt/wildfly/bin/launch.sh
接下来,创建一个systemd初始化文件:
vi /etc/systemd/system/wildfly.service
将此添加到新文件:
[Unit]
Description=The wildfly Application Server
After=syslog.target network.target
Before=nginx.service
[Service]
Environment=LAUNCH_JBOSS_IN_BACKGROUND=1
EnvironmentFile=/etc/default/wildfly
User=wildfly
LimitNOFILE=102642
PIDFile=/var/run/wildfly/wildfly.pid
ExecStart=/opt/wildfly/bin/launch.sh $WILDFLY_MODE $WILDFLY_CONFIG $WILDFLY_BIND
StandardOutput=null
[Install]
WantedBy=multi-user.target
保存该文件
并设置文件和目录的所有权:
chown wildfly:wildfly -R /opt/wildfly/
systemctl enable wildfly
我们还需要禁用nginx监听端口80(wildfly将负责此操作):
vi /etc/nginx/sites-enabled/default
注释掉:
#listen [::]:80 default_server;
接下来,我们需要创建一个新的nginx服务器块,以使用nginx作为反向代理来访问wildfly:
vi /etc/nginx/sites-available/wildfly
将此添加到新文件:
upstream wildfly {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name your-domain.com;
access_log /var/log/nginx/wildfly.access.log;
error_log /var/log/nginx/wildfly.error.log;
proxy_buffers 16 64k;
proxy_buffer_size 128k;
location / {
proxy_pass http://wildfly;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_redirect off;
proxy_set_header Host $host;
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 https;
}
}
在命令行中,在nginx和wildfly之间创建一个符号链接,然后启动wildfly服务并启用wildfly以nginx在启动时启动:
ln -s /etc/nginx/sites-available/wildfly /etc/nginx/sites-enabled/
systemctl enable nginx
systemctl start nginx.service
groupadd -r wildfly
useradd -r -g wildfly -d /opt/wildfly -s /sbin/nologin wildfly
systemctl daemon-reload
systemctl start wildfly
专业提示–如果您需要更改上述任何一项,请使用以下命令重新启动nginx和wildfly:
systemctl restart nginx.service
将.WAR文件部署到wildfly服务器
现在您可以将.WAR文件传输到VM。 最简单的方法是scp(安全副本)。
scp /mnt/c/GitHub/todo-app-java-on-azure/target/todo-app-java-on-azure-1.0-SNAPSHOT.war <username>@< PublicIpAddress>:~/
使用mv命令将文件重新定位到/ opt / wildfly / standalone / deployments /文件夹,wildfly将在其中自动为您启动文件。 然后通过以下URL访问该应用程序:
http://<VMPublicIpAddress>
如果您走到了这一步,尽管如此,我们还是感谢并恭喜! 您知道有一个Java应用程序在云中Linux VM的wildfly服务器上运行并访问Azure上MySQL数据库。 有很多配置步骤,但是一旦建立了初始环境,就很容易设置部署管道以将新版本的代码和数据库推送到Azure环境
与往常一样,我们重视您的反馈意见,因此请让我们知道您的想法!
批量关停azure vm