|
| 1 | +--- |
| 2 | +title: Golang Baseline Testing |
| 3 | +weight: 6 |
| 4 | + |
| 5 | +### FIXED, DO NOT MODIFY |
| 6 | +layout: learningpathall |
| 7 | +--- |
| 8 | + |
| 9 | + |
| 10 | +### Baseline testing of Golang Web Page on Azure Arm64 |
| 11 | +This guide demonstrates how to test your Go installation on Azure Arm64 by creating and running a simple Go web server that serves a styled HTML page. |
| 12 | + |
| 13 | +**1. Create Project Directory** |
| 14 | + |
| 15 | +First, create a new folder called goweb to hold your project and move inside it: |
| 16 | + |
| 17 | +```console |
| 18 | +mkdir goweb && cd goweb |
| 19 | +``` |
| 20 | +This makes a directory named goweb and then changes into it. |
| 21 | + |
| 22 | +**2. Create HTML Page with Bootstrap Styling** |
| 23 | + |
| 24 | +Next, create a file named `index.html` using the nano editor: |
| 25 | + |
| 26 | +```console |
| 27 | +nano index.html |
| 28 | +``` |
| 29 | + |
| 30 | +Paste the following HTML code inside. This builds a simple, styled web page with a header, a welcome message, and a button using Bootstrap. |
| 31 | + |
| 32 | +```html |
| 33 | +<!DOCTYPE html> |
| 34 | +<html lang="en"> |
| 35 | +<head> |
| 36 | + <meta charset="UTF-8"> |
| 37 | + <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| 38 | + <title>Go Web on Azure ARM64</title> |
| 39 | + < link href= "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel= "stylesheet"> |
| 40 | + <style> |
| 41 | + body { |
| 42 | + background: linear-gradient(135deg, #6dd5fa, #2980b9); |
| 43 | + color: white; |
| 44 | + min-height: 100vh; |
| 45 | + display: flex; |
| 46 | + align-items: center; |
| 47 | + justify-content: center; |
| 48 | + text-align: center; |
| 49 | + } |
| 50 | + .card { |
| 51 | + background: rgba(255, 255, 255, 0.9); |
| 52 | + color: #333; |
| 53 | + border-radius: 20px; |
| 54 | + box-shadow: 0 4px 15px rgba(0,0,0,0.2); |
| 55 | + } |
| 56 | + </style> |
| 57 | +</head> |
| 58 | +<body> |
| 59 | + <div class="container"> |
| 60 | + <div class="card p-5"> |
| 61 | + <h1 class="mb-3"> Go Web on Azure Arm64</h1> |
| 62 | + <p class="lead">This page is powered by Golang running on the Microsoft Azure Cobalt 100 processors.</p> |
| 63 | + <a href="/api/hello" class="btn btn-primary mt-3">Test API Endpoint</a> |
| 64 | + </div> |
| 65 | + </div> |
| 66 | +</body> |
| 67 | +</html> |
| 68 | +``` |
| 69 | +**3. Create Golang Web Server** |
| 70 | + |
| 71 | +Now create the Go program that will serve this web page: |
| 72 | + |
| 73 | +```console |
| 74 | +nano main.go |
| 75 | +``` |
| 76 | +Paste the code below. This sets up a very basic web server that serves files from the current folder, including the **index.html** you just created. When it runs, it will print a message showing the server address. |
| 77 | + |
| 78 | +```go |
| 79 | +package main |
| 80 | +import ( |
| 81 | + "encoding/json" |
| 82 | + "log" |
| 83 | + "net/http" |
| 84 | + "time" |
| 85 | +) |
| 86 | +func main() { |
| 87 | + // Serve index.html for root |
| 88 | + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { |
| 89 | + if r.URL.Path == "/" { |
| 90 | + http.ServeFile(w, r, "index.html") |
| 91 | + return |
| 92 | + } |
| 93 | + http.FileServer(http.Dir(".")).ServeHTTP(w, r) |
| 94 | + }) |
| 95 | + // REST API endpoint for JSON response |
| 96 | + http.HandleFunc("/api/hello", func(w http.ResponseWriter, r *http.Request) { |
| 97 | + w.Header().Set("Content-Type", "application/json") |
| 98 | + json.NewEncoder(w).Encode(map[string]string{ |
| 99 | + "message": "Hello from Go on Azure ARM64!", |
| 100 | + "time": time.Now().Format(time.RFC1123), |
| 101 | + }) |
| 102 | + }) |
| 103 | + log.Println("Server running on http://0.0.0.0:80") |
| 104 | + log.Fatal(http.ListenAndServe(":80", nil)) |
| 105 | +} |
| 106 | +``` |
| 107 | + |
| 108 | +**4. Run on the Web Server** |
| 109 | + |
| 110 | +Run your Go program with: |
| 111 | + |
| 112 | +```console |
| 113 | +go run main.go |
| 114 | +``` |
| 115 | + |
| 116 | +This compiles and immediately starts the server. If successful, you’ll see the message: |
| 117 | + |
| 118 | +```output |
| 119 | +2025/08/19 04:35:06 Server running on http://0.0.0.0:80 |
| 120 | +``` |
| 121 | +**5. Allow HTTP Traffic in Firewall** |
| 122 | + |
| 123 | +On Azure Linux 3.0 virtual machines, firewalld runs by default as an additional layer of firewall control. By default, it allows only SSH (22) and a few core services. |
| 124 | +So even if Azure allows HTTP port 80 (port 80 is added to inbound ports during VM creation), your VM’s firewalld may still block it until you run: |
| 125 | + |
| 126 | +```console |
| 127 | +sudo firewall-cmd --permanent --add-service=http |
| 128 | +sudo firewall-cmd --reload |
| 129 | +``` |
| 130 | + |
| 131 | +You can verify that HTTP is now allowed by listing active services: |
| 132 | + |
| 133 | +```console |
| 134 | +sudo firewall-cmd --list-services |
| 135 | +``` |
| 136 | + |
| 137 | +Example output: |
| 138 | + |
| 139 | +```output |
| 140 | +dhcpv6-client http https mdns ssh |
| 141 | +``` |
| 142 | + |
| 143 | +If firewall-cmd is not found, ensure your $PATH includes standard directories: |
| 144 | + |
| 145 | +```console |
| 146 | +export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin |
| 147 | +``` |
| 148 | +So now, when you type firewall-cmd, the shell searches through the updated $PATH, finds /usr/bin/firewall-cmd, and executes it. |
| 149 | + |
| 150 | +However, if you are working inside an Azure Linux 3.0 Docker container hosted on an Ubuntu virtual machine, you must bind the container’s port 80 to the VM’s port 80 and then allow HTTP traffic through the Ubuntu VM’s firewall. |
| 151 | + |
| 152 | +Create the Docker container as follows: |
| 153 | +```console |
| 154 | +sudo docker run -it --rm -p 80:80 mcr.microsoft.com/azurelinux/base/core:3.0 |
| 155 | +``` |
| 156 | +This command maps container port 80 to the Ubuntu VM’s port 80. The Golang installation steps inside the Azure Linux 3.0 container remain the same as described above. |
| 157 | + |
| 158 | +Now, to allow HTTP in the firewall on your Ubuntu virtual machine, run as follows: |
| 159 | + |
| 160 | +```console |
| 161 | +sudo ufw allow 80/tcp |
| 162 | +sudo ufw enable |
| 163 | +``` |
| 164 | + |
| 165 | +**6. Open in Browser** |
| 166 | + |
| 167 | +Run the following command to print your VM’s public URL, then open it in a browser: |
| 168 | + |
| 169 | +```console |
| 170 | +echo "http://$(curl -s ifconfig.me)/" |
| 171 | +``` |
| 172 | +When you visit this link, you should see the styled HTML page being served directly by your Go application. |
| 173 | + |
| 174 | +You should see the Golang web page confirming a successful installation of Golang. |
| 175 | + |
| 176 | + |
| 177 | + |
| 178 | +Now, your Golang instance is ready for further benchmarking and production use. |
0 commit comments