我正在尝试建立一个简单的自定义网站。我使用 Golang 和 Gin-gonic 框架构建了一个简单的服务器。我的 Go 服务器如下:
func main() {
r := gin.Default()
r.GET("/", ServeMainPage)
r.GET("/icons/openlogo-75.png", func(c *gin.Context) {
c.File("favicon.ico")
})
r.GET("/episode/:id", ServeEpisode)
r.GET("styles/style.css", func(c *gin.Context) {
c.File("styles/style.css")
})
r.GET("scripts/main.js", func(c *gin.Context) {
c.File("scripts/main.js")
})
r.GET("favicon.ico", func(c *gin.Context) {
c.File("favicon.ico")
})
r.Run()
}
func ServeMainPage(c *gin.Context) {
c.File("index.html")
}
func ServeEpisode(c *gin.Context) {
episodeID := c.Param("id")
filepath := "AudioFiles/" + episodeID + ".mp3"
c.File(filepath)
}
由于此进程无法访问端口 80(它在 :8080 上运行),并且由于我正在尝试提高自己的技能,因此我尝试设置一个 nginx 服务器来充当反向代理。我的 nginx 服务器具有以下默认配置,
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
我按照教程这里/etc/nginx/sites-available/ro
通过添加以下内容并将其符号链接到,将其转发到我的 Golang 应用程序/etc/nginx/sites-enabled/ro
。
server {
listen 80;
server_name running-oaks.com;
location / {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
proxy_pass "http://127.0.0.1:8080";
}
}
如果我在本地 PC 上使用 curl 访问我的服务器,我会得到我想要的 index.html 页面。我的 curl 命令很简单curl http://123.123.123.123
,其中123.123.123.123
替换为我的远程服务器的实际 IP。
但是,尝试使用我的 Web 浏览器访问同一 IP 地址时,只会显示默认的 Apache for Debian 页面。我在设置 nginx 之前卸载了 Apache,以便希望避免冲突。在 curl 和浏览器情况下,我都可以看到我的 Golang 应用程序正在接收请求并返回状态 200。
那么为什么我的浏览器一直显示 debian 页面?
我也已将其更改/var/www/index.html
为默认 nginx 页面,尽管这也没有解决问题。
答案1
问题是您的请求与您的服务器块不匹配,但与默认服务器块匹配。
你有:
server {
listen 80;
server_name running-oaks.com;
这将与主机名为“running-oaks.com”的端口 80 上的任何传入请求匹配。
Ubuntu 开箱即用地包含一个已启用的站点文件/etc/nginx/sites-enabled/default
,它是 的符号链接/etc/nginx/sites-available/default
。这是提供 Debian 主页的站点定义。
在此配置文件中,有一个服务器块,其启动方式如下:
server {
listen 80 default_server;
listen [::]:80 default_server;
此块没有 server_name,但有default_server
指令。这意味着任何来自端口 80 且与其他服务器块不匹配的请求都应使用此服务器块。
由于您的请求使用的是直接 IP 而不是您在 server_name 指令上指定的主机名,因此您的请求与默认服务器匹配,而不是您自己的服务器。
要修复此问题,您可以删除符号链接/etc/nginx/sites-enabled/default
并将default_server
指令添加到 listen 行。请记住在执行此操作后重新启动 Nginx。
(添加 default_server 是多余的,因为如果只有一个服务器,它默认为默认服务器,但最好明确说明。)