树莓派(12):nginx 网页服务器与反向代理

nginx 是一款毛子写的高性能网页服务和反向代理服务软件。使用它,可以把自己的静态、动态网页发布出去,或者作为一个代理使外界能访问服务器上无法直接访问的资源。nginx 支持 HTTPS,因而也可以用来把 HTTP 的服务代理为 HTTPS。

安装

直接使用 apt:

apt install nginx

注:在 CentOS 上, 需要先安装 epel:

yum install epel-release

配置文件

Nginx 的配置文件在/etc/nginx/,这个文件夹下的文件大多被include到了主配置文件nginx.conf中。nginx 的配置文件结构大致是:

http
{
  some settings;
  server
  {
    some settings;
  }
  server
  {
    some settings;
  }
  something;
}

我们需要修改的参数主要是server部分。常常在nginx.conf中看不到server,这是因为它被放在外部文件中而被include进来了。这一步需要看具体情况来操作。

在我的树莓派上是这样的:

include /etc/nginx/sites-enabled/*;

也就是说真正的server配置部分在上面的这个文件中。那么去到这个文件夹修改下面的文件,我的是:

/etc/nginx/sites-enabled/default

server内设置字段概述

listen

用于指定监听端口,也就是对外开放的端口。例如:

listen 80;

监听 ipv4 上的 80 端口(HTTP 默认端口)。

listen [::]:80;

监听 ipv6 上的 80 端口。

listen设置只能出现在server中,但可以出现多次。

server_name

指明虚拟主机的名字,用于选择不同的虚拟主机。

在我刚开始学习的时候,这个设置令我相当疑惑。其实它主要用于多域名:在打开一个网页时,浏览器会向服务器发送一个 HTTP 请求头,这个头里面包含了所请求的域名。服务器接收到这个域名,便可以得知要进行哪个域名的服务。这样,一个服务器就可以给多个域名(注意:1.a.com 与 2.a.com 是不同的域名)提供服务,就好像是多个服务器一样,也就因此有了“虚拟主机”的名字。

例如:beardic.cn与tools.beardic.cn,在域名解析中它们指向同一个地址 47.94.238.201,但得到的内容却是不同的。只需要创建两个server,分别设置它们的server_name为 beardic.cn 和 tools.beardic.cn 即可。

这个字段的设置也可以是 IP 地址,用于 IP 直接访问的时候。可以用来禁止直接的 IP 访问。

使用配置server_name _可以在别的server都匹配失败时进行接管。在这种情况下如果没有这个配置,则将使用顺序第一个的server

server_name只能出现在server中,且只能出现一次。

root

设置网站的根目录。例如:

root /var/www/html/;

那么,假如你的域名是 example.com,访问 example.com/folder/pic.jpg 即是访问 /var/www/html/folder/pic.jpg。

root设置可以出现在serverlocation中。

index

设置默认主页名字。一般(如果使用了 PHP)的设置是:

index index.html index.htm index.php;

它的作用是,访问网址 example.com/folder/(而不是 example.com/folder/index.html)时,自动依次检索 folder 目录下的 index.html、index.htm、index.php,一旦找到就返回给用户。

index设置可以出现在serverlocation中。

location

location里面又另有一番天地。它可以有多个,用来匹配用户请求的地址中server_name后面的部分。反向代理就会用到这个,例如在反代 deluge-web 时:

location /deluge/
{
  proxy_pass http://localhost:8112/;
  proxy_set_header X-Deluge-Base "/deluge/";
  add_header X-Frame-Options SAMEORIGIN;	
}

我们先看这段配置的第一行:location /deluge/。这表示它会匹配对 example.com/deluge/ 以及子目录的所有请求。

里面的第一句proxy_pass http://localhost:8112/;是反代的核心。它表示,把匹配到的所有请求都转发到 http://localhost:8112/ 上,从而使外界访问 example.com/deluge 的时候能看到在服务器上访问 http://localhost:8112/ 所看到的页面。

而后面的两句就和 HTTP 请求头有关系了。前面讲到 HTTP 请求头会包含用户请求的域名,事实上它除此之外还有用户的 IP、请求方法、Cookie、加密算法等信息。直接的proxy_pass会使后端服务器接收到的请求头与用户实际发出的请求头不同,所以可能需要加上一些额外的语句。

当然,location里面也可以不是proxy_pass,它还可以是rootindex来使用不同的根目录:所以上面说location里面又有一番天地。

此外,location的第一行匹配还有别的方式,例如location = /a/

location匹配结尾是否加斜杠“/”与其中的rootproxy_pass结尾是否加反斜杠之间有一定关系,不同组合有不同效果。可参考这篇文章里面的实验。

locationserver中可以出现多次。

access_log

用于记录访问日志。一般写法:

access_log /var/log/thelogfile.log;

或者关闭之:

access_log off;

能够出现在httpserverlocation中。可以在server中打开,而在某些特定的location中关闭。

例子

deluge反代

有关 deluge,可以参看之前的文章

server 
{
  listen 80;
  listen [::]:80;
  server_name example.com;

  index index.html index.htm index.php;
  root /home/www/;

  access_log  /home/wwwlogs/access.log;
  location /deluge/
  {
    proxy_pass http://localhost:8112/;
    proxy_set_header X-Deluge-Base "/deluge/";
    add_header X-Frame-Options SAMEORIGIN;	
  }   
}

这个例子在上面有提到。deluge-web 是默认在某个端口上进行服务的,并且不支持 HTTPS。往往反代它的目的是转移到另一个端口(80)的子目录,并且加上 HTTPS,达到方便且安全的目的。

在实际应用中,这段配置最关键的部分是proxy_set_header X-Deluge-Base "/deluge/",它在http请求头中加入了子目录信息。这是因为 deluge-web 自带的服务端会匹配子目录,如果访问的地址不匹配,将只会展示一个有标题的空白页,见这篇文章

部署静态网页

要部署静态网页,只需要把网页及其附带文件放入root所定义的根目录下。例如在上面的 deluge 例子中,定义了root在文件夹 /home/www/ 下,那么通过 FTP 等文件传输的方式传网页至 /home/www/somepath/ 就可以了。结合index配置,能够使访问 example.com/somepath/ 时直接访问主页。当然,把网页放在网站根目录也是可以的。

以 AriaNg(Git)为例。Aria 是一个优秀的下载器,但是没有好看易用的图形用户界面(GUI)。AriaNg 是为 Aria 开发的一个单纯的网页 GUI,由 HTML+CSS+JS 实现,不涉及 PHP,是一个静态网页。部署它甚至不需要修改 nginx 配置文件,只需把它放到所希望的目录下就可以了。例如,我配置的 root 是 /home/wwwroot/default,然后 AriaNg 在 /home/wwwroot/default/aria/,那么访问 your.domain/aria/ 即可。

评论

avatar
  订阅  
提醒我