[Day14] 架设 Nginx 当我们的 Web Server

.NET 5 Web API 布署到 Linux 上执行的时候,会跑在一个 Kestrel 服务器上。Kestrel 从 .NET Core 1.x 发展至今,其实功能已经相当完善,可以直接当作对外的窗口。不过本系列不会用内建的 Kestrel 来对外,而是使用一个同样轻巧、但是高效又炫炮的 web server 来帮我们做反向代理(inverse proxy),而这个炫炮的 server 就 Nginx。

什麽是 Web Server

笔者之前尝试自己写这段,但是後来找参考资料的时候发现这篇,就决定把自己写的全部删掉,直接开传送门就好…等级差太多了QQ

不过,懒人包还是要有,web server以最粗浅的理解就是:

  1. 我们对外的窗口,接收 http/https request
  2. 根据接收到的 request,视情况回传静态资源或转发 request 到背後执行的程序
  3. 在高流量的应用中作为负载平衡器(load balancer),把 request 分散到背後执行的多个程序实体

安装并启动 Nginx

一样透过 yum 直接下载并安装 Nginx
sudo yum install sudo yum install nginx

Nginx 其实是依附在 EPEL (Extra Packages for Enterprise Linux) 这个 Package 之中,GCP 的 CentOS 内建这个 EPEL所以可以直接安装,如果邦友是用 DigitalOcean 的 CentOS,会需要先安装 EPEL
sudo yum install epel-release

装完之後,就能透过 systemctl 启动 Nginx
sudo systemctl start nginx
接着到浏览器输入 http://外部IP(不是 https 喔)就能看到 Nginx 在 CentOS 上的预设首页
https://ithelp.ithome.com.tw/upload/images/20210914/20140664YC9bEOyTjS.png

这里稍微说明一下,刚安装完 Nginx 尚未做任何设定之前,Nginx 只帮我们处理 80 port 的 http request,而且会直接回覆静态的 Welcome 首页。因为 http request 预设走 80 port;https 走443,所以当我们发送 http request到我们的 VM 时,Nginx 就会帮我们回覆上面那个页面。发送 https request 则会连不到东西 XD

Nginx 预设不会随着开机启动,为了方便,我们一样透过 enable 指令把它加入开机自动启动的名单中
sudo systemctl enable nginx

设定 Nginx 转发请求

目前我们的 Nginx 是根据 /etc/nginx/nginx.conf 这个预设设定档在执行,根据前辈们的建议,比较好的做法是把这个档案里的 server 区段注解掉,然後让同样这个档案里的 include /etc/nginx/conf.d/*.conf; 引入其他设定。

所以首先,先打开预设的设定档
sudo vi /etc/nginx/nginx.conf
然後把 server 区段用井号(#)注解掉

#    server {
#        listen       80;
#        listen       [::]:80;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        # Load configuration files for the default server block.
#       include /etc/nginx/default.d/*.conf;
#
#        error_page 404 /404.html;
#        location = /404.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#        location = /50x.html {
#        }
#    }

接着,在 /etc/nginx/conf.d/ 资料夹底下,新增属於我们 API 专案的设定档
sudo touch /etc/nginx/conf.d/ironman.conf
再用 vim 打开这个档案,加入下列设定

server {
    listen        80;
    server_name   example.com *.example.com;
    location / {
        proxy_pass         http://127.0.0.1:5000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

存档之後用 sudo nginx -t 指令测试设定档有没有问题。没有问题的话就能用 sudo nginx -s reload 让 Nginx 重新载入设定档

这时候如果马上就开启浏览器连我们的 VM,会跳出 502 Bad Gateway 错误,这是因为 CentOS 有一个叫做 Security-Enhanced Linux (SELinux) 的东西来加强安全性,它会阻挡我们的连线。我们可以用下列这行指令来解决这个问题
sudo setsebool -P httpd_can_network_connect on

执行完毕之後,再次到浏览器输入 http://外部IP/api/User 就会发现,我们的 http request 最後会变成 https://外部IP:5001/api/User,原因是我们的 request 被 Nginx 转发到 127.0.0.1:5000(本机的 5000 port),然後 .NET 玉社会把 http request 重新导向到 https 监听的 port,於是最後我们就从https://外部IP:5001/api/User 取得我们的资料。

Nginx 虽然轻巧而且功能强大,但是笔者觉得它的水也有点深,关於 Nginx 更多的知识与设定,请参考前面传送门的续篇

明天我们将会稍微介绍一下如何为我们的 Nginx 挂上 SSL 凭证,替它加上锁头。


<<:  Day2关於『程序』的起源和特性&演算法

>>:  Day2 帐号申请与管理

Day 5 - 断点设定

Tailwindcss 使用 normalize.css 来当作初始化样式,和 Bootstrap...

Day 4 python回圈

今天我们要介绍的是python当中的FOR回圈,所谓的回圈就是只我们如果要在某个条件下要重复做某些事...

[Day26] 用 Rocket 做一个图书馆门禁後端 (Part 3)

今天就要打疫苗了 然後我现在还没睡 掰了 明天没看到我的文就代表真的掰了 QQ 好 今天准备的内容比...

生存法则一:在快速变动的环境下生存

承认我们都有一些资讯焦虑 我们生活在快速变动的时代,无时无刻都有新的产业跟名词冒出,数据驱动决策、区...

大共享时代系列_007_共享交通

驶向新方向~ 需要花钱买交通工具吗? 每个人对於交通工具的使用需求不同,对某些偶尔使用的人来说,有需...