记录一下 Nginx 的基本使用与建站配置,免得改的时候又忘记了。 (这里不涉及 hexo 博客还有 cloudreve 网盘的具体配置细节,这两个内容有专门的笔记)

Nginx 基本使用

基本命令

常见操作要求在 root 用户下进行:

  1. 第一类操作
  • 启动:systemctl nginx start
  • 关闭:systemctl nginx stop
  • 重启:systemctl nginx restart
  1. 第二类操作
  • 测试:nginx -t,显示配置文件目录,检查 nginx.conf 是否有语法错误,并进行测试。
  • 重新加载配置:nginx -s reload,reload 命令会重新加载配置文件,此时 nginx 服务不会中断,服务启动,文件即加载成功。
  • 平稳地关闭:nginx -s quit,迅速地关闭:nginx -s stop

配置逻辑

首先记录一下 Nginx 的配置逻辑:(root 用户直接apt-get安装,而非源码编译)nginx 配置文件全部位于/etc/nginx/目录,其中值得关注的包括:

  • nginx.conf 主配置文件
  • sites-available/ 文件夹
  • sites-enable/ 文件夹

主配置文件 nginx.conf 会先导入一些模块,值得关注的是最后的两行

1
2
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

通常情况下:

  • conf.d/ 没有任何东西
  • sites-available/ 含义为可以启用的站点,默认含有一个文件 default
  • sites-enabled/ 含义为正在启用的站点,默认含有一个文件 default,sites-enabled/ 通常只是一个中转环节,包括若干个指向 sites-available/ 具体站点配置的软链接

建站配置

因为个人不是相关专业的,下面的只是自己的理解和记录,可能有的表述不够准确。

防火墙

由于使用的是云服务器,这里实际上涉及了两层防火墙:

  • 第一层是腾讯云提供的防火墙,可以在腾讯云的控制台进行修改
  • 第二层是系统防火墙,需要在系统上进行修改(ufw)

防火墙主要关注:允许或禁止哪些 ip 哪些协议(TCP/UDP)访问哪些端口,腾讯云的防火墙只会管理入流量,对于出流量默认全部开放。

关于 IP 的基本知识:

  • 私网 IP 地址范围:
    • 10.0.0.0 ~ 10.255.255.255(A类私网地址)
    • 172.16.0.0 ~ 172.31.255.255(B类私网地址)
    • 192.168.0.0 ~ 192.168.255.255(C类私网地址)
  • 公网 IP 地址:所有非私网保留范围的IP地址均属于公网地址,(理想情况下)可直接在互联网上路由。

关于端口的基本知识:端口使用一个 16 位的数字表示,它的范围是 0~65535,包括:

  • 0 到 1023 是被知名服务(Well-Known Ports)使用的端口,例如 http 的 80,https 的 443
  • 从 1024 到 49151,它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。
  • 从 49152 到 65535,理论上,不应为服务分配这些端口。实际上,机器通常从 1024 起分配动态端口。

如果一个服务(进程)已经在监听某个端口,那么其它服务就不可以再使用。

几个常见的默认端口:

  • 80 端口 默认 http 网络服务
  • 443 端口 默认 https 网络服务
  • 22 端口 默认 Linux ssh 远程登陆
  • 3389 端口 默认 Windows 远程登陆

当前的腾讯云防火墙的规则如下,这里除了浏览器需要的默认端口 80 和 443,其它都进行了更改:

  • 80 端口允许
  • 443 端口允许
  • 22 和 3389 端口,即Linux和Windows默认的远程登陆的默认端口,出于安全原因选择拒绝
  • 12138 端口允许,用于 ssh 远程登陆

系统防火墙可以由 root 用户使用ufw status查看,当前规则如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Status: active

To Action From
-- ------ ----
12138/tcp ALLOW Anywhere
22/tcp DENY Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
5555/tcp ALLOW Anywhere
12138/tcp (v6) ALLOW Anywhere (v6)
22/tcp (v6) DENY Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
5555/tcp (v6) ALLOW Anywhere (v6)

注:

  • 防火墙如果未启用,那么默认允许所有的进出访问。
  • 防火墙启动状态下,缺省的默认规则是禁止。
  • 可以使用 ufw 相关命令进行规则的新建或删除,例如ufw delete allow 12138/tcp,对于规则的修改是实时生效的,不需要重启防火墙。(ufw开启之前务必反复确认规则是什么,不然一不小心把所有端口禁止,ssh远程登陆的端口也会被禁掉,只能去机房直接登陆,或者使用云平台的特殊手段登陆)

域名

在腾讯云购买了几年的域名fenglielie.top

SSL

为了支持https访问,申请为域名和子域名申请SSL证书,目前申请了两个免费域名:

  • fenglielie.top
  • cloud.fenglielie.top

将申请得到的证书放在固定位置(Nginx需要配置对应路径),例如

1
/home/fenglielie/.config/ssl/fenglielie.top_nginx/

目前免费域名的SSL证书有效期只有两三个月,很麻烦,需要频繁更新。

DNS

需要在腾讯云上面设置域名的 DNS 解析规则,当前包括:

  • fenglielie.top 指向云服务器的公网 ip
  • cloud.fenglielie.top (子域名)指向云服务器的公网 ip

注意这里没有为files.fenglielie.top设置DNS,同时也没有为其设置SSL,因此在浏览器上无法正常访问,但是通过wget这类命令仍然是可以使用的。

Nginx 网站配置

包括如下几条配置:

  • default_403
  • fenglielie.top
  • cloud.fenglielie.top
  • files.fenglielie.top

将这些文件存放在/etc/nginx/sites-available/中,然后在/etc/nginx/sites-enabled/中创建同名的软链接指向对应的项。

default_403

使用下面的配置进行默认匹配,它起到兜底的效果:如果后续的其它规则都不符合,就会对应到当前的配置,从而默认 403 拒绝。(否则 Nginx 可能将第一个配置视作默认行为)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Default server configuration
# 默认虚拟主机配置,用于禁用默认请求
server {
listen 80 default_server;
listen 443 default_server ssl;
listen 12139 default_server ssl;

server_name _;

ssl_certificate /home/fenglielie/.config/ssl/fenglielie.top_nginx/fenglielie.top_bundle.crt;
ssl_certificate_key /home/fenglielie/.config/ssl/fenglielie.top_nginx/fenglielie.top.key;

return 403;
}

fenglielie.top

这就是当前的博客网站,配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
## fenglielie.top

# http -> https
server {
listen 80;
server_name fenglielie.top www.fenglielie.top;

return https://fenglielie.top$request_uri;
}

server {
listen 443 ssl;
server_name fenglielie.top www.fenglielie.top;

ssl_certificate /home/fenglielie/.config/ssl/fenglielie.top_nginx/fenglielie.top_bundle.crt;
ssl_certificate_key /home/fenglielie/.config/ssl/fenglielie.top_nginx/fenglielie.top.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305';
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";

root /home/open/blog;

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

#禁止Scrapy等工具的抓取
if ($http_user_agent ~* (Scrapy|Curl|HttpClient|Wget)) {
return 403;
}

#禁止指定UA及UA为空的访问
if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|LinkpadBot|Ezooms|^$" )
{
return 403;
}

#禁止非GET|HEAD|POST方式的抓取
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 405;
}

if ($http_user_agent ~* ApacheBench|WebBench|java/){
return 403;
}

if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
return 403;
}

#if ($http_user_agent ~* (bot|spider) ) {
# return 403;
#}

location / {
try_files $uri $uri/ $uri.html /404.html $uri.html =404;
}
}

解释:

  • 监听 80 端口的 fenglielie.topwww.fenglielie.top,并转到443端口
  • 监听 443 端口的 fenglielie.topwww.fenglielie.top
  • 设置网站根位置为 /home/open/blog
  • 设置SSL证书位置为 /home/fenglielie/.config/ssl/fenglielie.top_nginx
  • 禁止一些常见爬虫等安全措施

files.fenglielie.top

有一个服务还是很酷并且很方便的,那就是把文件存放在云服务器上,例如服务器上有test文件,通过下面的命令可以将其一键下载到本地

1
wget files.fenglielie.top/test

配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
## files.fenglielie.top

server {
listen 80;
server_name files.fenglielie.top;

root /home/open/files;

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

#禁止Scrapy等工具的抓取
#if ($http_user_agent ~* (Scrapy|Curl|HttpClient|Wget)) {
#return 403;
#}

#禁止指定UA及UA为空的访问
if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|LinkpadBot|Ezooms|^$" )
{
return 403;
}

#禁止非GET|HEAD|POST方式的抓取
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 405;
}

if ($http_user_agent ~* ApacheBench|WebBench|java/){
return 403;
}

#if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
#return 403;
#}

if ($http_user_agent ~* (bot|spider) ) {
return 403;
}

location / {
try_files $uri $uri/ $uri.html /404.html $uri.html =404;

#autoindex on; # 启用目录浏览
#autoindex_exact_size off; # 显示文件大小的近似值
#autoindex_localtime on; # 使用本地时间
}
}

解释:

  • 监听 80 端口的 files.fenglielie.top
  • 设置网站根位置为 /home/open/files,将需要公开的文件放在这个位置即可
  • 禁止一些常见爬虫等安全措施

cloud.fenglielie.top

搭建cloudreve云盘服务。

配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
## cloud.fenglielie.top

server {
listen 443 ssl;
server_name cloud.fenglielie.top;

ssl_certificate /home/fenglielie/.config/ssl/cloud.fenglielie.top_nginx/cloud.fenglielie.top_bundle.crt;
ssl_certificate_key /home/fenglielie/.config/ssl/cloud.fenglielie.top_nginx/cloud.fenglielie.top.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305';
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

#禁止Scrapy等工具的抓取
#if ($http_user_agent ~* (Scrapy|Curl|HttpClient|Wget)) {
# return 403;
#}

#禁止指定UA及UA为空的访问
if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|LinkpadBot|Ezooms|^$" )
{
return 403;
}

#禁止非GET|HEAD|POST方式的抓取
#if ($request_method !~ ^(GET|HEAD|POST)$) {
# return 405;
#}

if ($http_user_agent ~* ApacheBench|WebBench|java/){
return 403;
}

if ($http_user_agent ~* (bot|spider) ) {
return 403;
}

location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://127.0.0.1:5212;

# 如果您要使用本地存储策略,请将下一行注释符删除,并更改大小为理论最大文件尺寸
client_max_body_size 100m;
}
}

解释:

  • 监听 443 端口的 cloud.fenglielie.top
  • 代理转发到本地的5212端口(cloudreve云盘)
  • 设置SSL证书位置为 /home/fenglielie/.config/ssl/cloud.fenglielie.top_nginx
  • 禁止一些常见爬虫等安全措施

test.fenglielie.top(已关闭)

test.fenglielie.top就是一个测试网站,内容是一个最简单的静态网站demo,只是用来实验的,目前已全部删除。

配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
server {
listen 80;
server_name test.fenglielie.top;

root /home/open/testsite;

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

#禁止Scrapy等工具的抓取
if ($http_user_agent ~* (Scrapy|Curl|HttpClient|Wget)) {
return 403;
}

#禁止指定UA及UA为空的访问
if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|LinkpadBot|Ezooms|^$" )
{
return 403;
}

#禁止非GET|HEAD|POST方式的抓取
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 405;
}

if ($http_user_agent ~* ApacheBench|WebBench|java/){
return 403;
}

if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
return 403;
}

if ($http_user_agent ~* (bot|spider) ) {
return 403;
}

location / {
try_files $uri $uri/ $uri.html /404.html $uri.html =404;
}
}

解释:

  • 监听 80 端口的 test.fenglielie.top
  • 网站根目录/home/open/testsite,将HTML文件放到对应位置即可
  • 禁止一些常见爬虫等安全措施