Nginx 服务器持续提供 Debian 主页服务

Nginx 服务器持续提供 Debian 主页服务

我正在尝试建立一个简单的自定义网站。我使用 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 是多余的,因为如果只有一个服务器,它默认为默认服务器,但最好明确说明。)

相关内容