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
设置可以出现在server
和location
中。
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
设置可以出现在server
和location
中。
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
,它还可以是root
、index
来使用不同的根目录:所以上面说location
里面又有一番天地。
此外,location
的第一行匹配还有别的方式,例如location = /a/
。
location匹配结尾是否加斜杠“/”与其中的root
或proxy_pass
结尾是否加反斜杠之间有一定关系,不同组合有不同效果。可参考这篇文章里面的实验。
location
在server
中可以出现多次。
access_log
用于记录访问日志。一般写法:
access_log /var/log/thelogfile.log;
或者关闭之:
access_log off;
能够出现在http
、server
、location
中。可以在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/ 即可。