Nginx基本使用与建站配置
记录一下 Nginx 的基本使用与建站配置,免得改的时候又忘记了。 (这里不涉及 hexo 博客还有 cloudreve 网盘的具体配置细节,这两个内容有专门的笔记)
Nginx 基本使用
基本命令
常见操作要求在 root 用户下进行:
- 第一类操作
- 启动:
systemctl nginx start
- 关闭:
systemctl nginx stop
- 重启:
systemctl nginx restart
- 第二类操作
- 测试:
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 | include /etc/nginx/conf.d/*.conf; |
通常情况下:
conf.d/
没有任何东西sites-available/
含义为可以启用的站点,默认含有一个文件 defaultsites-enabled/
含义为正在启用的站点,默认含有一个文件 default,sites-enabled/
通常只是一个中转环节,包括若干个指向sites-available/
具体站点配置的软链接
建站配置
因为个人不是相关专业的,下面的只是自己的理解和记录,可能有的表述不够准确。
防火墙
由于使用的是云服务器,这里实际上涉及了两层防火墙:
- 第一层是腾讯云提供的防火墙,可以在腾讯云的控制台进行修改
- 第二层是系统防火墙,需要在系统上进行修改(ufw)
防火墙主要关注:允许或禁止哪些 ip 哪些协议(TCP/UDP)访问哪些端口,腾讯云的防火墙只会管理入流量,对于出流量默认全部开放。
关于端口的基本知识:端口使用一个 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 | Status: active |
注:
- 缺省的默认规则是禁止。
- 可以使用 ufw
相关命令进行规则的新建或删除,例如
ufw delete allow 12138/tcp
,对于规则的修改是实时生效的,不需要重启防火墙。
域名
在腾讯云购买了几年的域名fenglielie.top
。
SSL
为了支持https访问,申请为域名和子域名申请SSL证书,目前申请了两个免费域名:
fenglielie.top
cloud.fenglielie.top
将申请得到的证书放在固定位置(Nginx需要配置对应路径),例如
1 | /home/fenglielie/.config/ssl/fenglielie.top_nginx/ |
目前免费域名的SSL证书有效期只有两三个月,很麻烦,需要频繁更新。
DNS
需要在腾讯云上面设置域名的 DNS 解析规则,当前包括:
fenglielie.top
指向云服务器的公网 ipcloud.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 | # Default server configuration |
fenglielie.top
这就是当前的博客网站,配置文件如下
1 | ## fenglielie.top |
解释:
- 监听 80 端口的
fenglielie.top
和www.fenglielie.top
,并转到443端口 - 监听 443 端口的
fenglielie.top
和www.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
41server {
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文件放到对应位置即可 - 禁止一些常见爬虫等安全措施
jupyter.fenglielie.top(已关闭)
鉴于jupyter服务没什么用(机器本身的性能不行,远程使用感觉也很卡),并且存在很大的安全隐患,因此这部分已经完全关闭了,只是将搭建的过程保留下来,需要的时候可以参考。(2024年9月4日)
jupyter notebook 或者 jupyter lab
服务都差不多,配置文件都在~/.jupyter/
中,并且需要设置的项都是类似的。
配置文件如下 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
45server {
# listen 80;
listen 12139 ssl;
server_name jupyter.fenglielie.top;
ssl_certificate /home/fenglielie/.config/ssl/jupyter.fenglielie.top_nginx/jupyter.fenglielie.top.crt;
ssl_certificate_key /home/fenglielie/.config/ssl/jupyter.fenglielie.top_nginx/jupyter.fenglielie.top.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://localhost:8888; # Jupyter Notebook 的地址和端口
proxy_set_header Host $host;
proxy_set_header X-Real-Scheme $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 120s;
proxy_next_upstream error;
proxy_redirect off;
proxy_buffering off;
# 设置跨域头部
add_header 'Access-Control-Allow-Origin' '*'; # 将域名替换为您的域名
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Allow-Credentials' 'true';
# 额外的跨域配置,根据需要添加
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
}
}
解释:
- 监听 12139 端口的
jupyter.fenglielie.top
,启用 ssl - 提供自签名的 ssl 证书,浏览器可能会警告
- 代理转发到本地的 8888 端口的 jupyter notebook/jupyter lab 服务
- 这里涉及跨域问题,因此进行了相应设置
当前的 miniconda 是 fenglielie
作为普通用户安装的,安装在~/miniconda3
,但是我并没有在.bashrc
中自动激活
conda 环境,这会影响 PATH,现在的选择是手动激活 base 环境
1
source ~/miniconda3/bin/activate
然后可以启动 jupyter notebook 或 jupyter lab 服务(要求先用 conda
安装),但是默认都是针对本地的服务,需要进行一下配置,首先生成配置文件
1
2jupyter notebook --generate-config
jupyter lab --generate-config
这个命令会生成文件:~/.jupyter/jupyter_notebook_config.py
和~/.jupyter/jupyter_lab_config.py
。
需要分别修改如下的项,这两组是相似的项,但名称不完全一样。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# jupyter_notebook_config.py
c.NotebookApp.allow_origin = '*'
c.NotebookApp.allow_remote_access = True
c.NotebookApp.notebook_dir = '/home/fenglielie/notebooks/'
c.NotebookApp.open_browser = False
c.NotebookApp.password = ****************************
c.NotebookApp.port = 8888
c.NotebookApp.token = ''
# jupyter_lab_config.py
c.ServerApp.allow_origin = '*'
c.ServerApp.allow_remote_access = True
c.ServerApp.notebook_dir = '/home/fenglielie/notebooks/'
c.ServerApp.open_browser = False
c.ServerApp.password = ****************************
c.ServerApp.port = 8888
c.ServerApp.token = ''
解释:
allow_origin
允许所有来源allow_remote_access
允许远程访问notebook_dir
工作目录open_browser
开启浏览器password
token
这两个与用户访问控制有关,见下文port
使用的端口,默认两个都是 8888,也可以把 lab 改成 8889
使用token = ''
可以禁止生成
token,然后我们可以使用密码,关于密码的生成过程如下:
在 Python 中执行如下命令,
1 | from notebook.auth import passwd |
输入密码,它会反馈一个密码 hash 值,把它填写到配置文件的 password 项。
在shell中直接输入jupyter lab
/jupyter notebook
即可启动(不可同时启动,因为占用同一个端口),此时从浏览器输入https://jupyter.fenglielie.top:12139
可以访问,注意这里必须同时指明端口号和
https,因为端口不是https默认的。
可以使用下面的操作启动 jupyter
服务并在后台运行,将输出定向到指定的日志中(需要完整路径)
1
nohup jupyter lab > /home/fenglielie/.jupyter/jupyter_lab_log_file.log 2>&1 &
对于不在后台运行的服务,直接 ctrl-C
两次即可关闭。对于在后台运行的服务,可以使用下面的命令查询 jupyter
相关的进程 1
ps -aux | grep jupyter
或者使用下面的命令查询当前用户的所有进程 1
ps ux
然后获取 jupyter-notebook 或者 jupyter-lab 的 PID,直接 kill 即可。
补充
对于VMware虚拟机(Ubuntu),有时会出现没有网络的情况,可以用下面的命令来解决
1
2
3sudo service NetworkManager stop
sudo rm /var/lib/NetworkManager/NetworkManager.state
sudo service NetworkManager start