危险

为之则易,不为则难

0%

Nginx

🥷 Node 和 Nginx 都可以作为服务器,Node 常用于上层的业务逻辑处理,而 Nginx 常用于底层的服务器资源处理,例如静态资源处理、正向代理(proxy_pass)、负载均衡(upstream)等。这儿记录一些 Nginx 的基础操作,涉及安装、常见配置、多域名/多站点、单域名/多站点、前端项目基本部署等。

静态资源通常指的是不经过服务器端处理,直接由服务器发送给客户端的文件,如 HTML、CSS、JavaScript 文件以及图片等。

Nginx 安装

Linux

通过官方指引能安装到最新的版本。

Windows

https://nginx.org/en/download.html

1
start nginx

查看进程

1
2
3
4
5
6
# git bash
tasklist | grep nginx.exe
# windows command
tasklist /fi "imagename eq nginx.exe"
# windows 查看端口占用
netstat -ano | findstr :3000
1
2
curl http://127.0.0.1:80
# 访问 http://127.0.0.1:80

Nginx 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo service nginx start
sudo service nginx restart
nginx -c /path/nginx.conf # 以特定目录下的配置文件启动 Nginx
nginx -s reload # 不重启服务的情况下更新配置
nginx -s stop
ngins -s quit # 优雅停止
nginx -t

ps -ef | grep nginx # 查看进程

du -sh file # 显示文件大小

tail -f error.log # 监听错误日志

Nginx 配置

1
2
whereis nginx
cat /etc/nginx/nginx.conf
加载自己的配置文件

nginx.conf

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
user  nginx;
worker_processes auto;

# 诊断日志
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;

events {
use epoll;
worker_connections 1024;
multi_accept on;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

# 审计日志
access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;
# 1
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types application/atom+xml application/geo+json application/javascript application/x-javascript application/json application/ld+json application/manifest+json application/rdf+xml application/rss+xml application/xhtml+xml application/xml font/eot font/otf font/ttf image/svg+xml image/jpeg image/gif image/png text/css text/javascript text/plain text/xml;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
# 2
include /etc/nginx/vhosts/*.conf;
# include /etc/nginx/conf.d/*.conf;
}

1
2
cd /etc/nginx/vhosts/ # 展示了 cert 文件夹和 zhihur.conf 配置文件
# cert => zhihur.com.key zhihur.com.pem

配置 HTTPS 证书和 root 或 proxy_pass,可以参考阿里云

新建自己的配置文件

zhihur.conf

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
server {
# HTTPS 的默认访问端口 443
# 如果未在此处配置 HTTPS 的默认访问端口,可能会造成 Nginx 无法启动
listen 443 ssl;

# 填写证书绑定的域名
server_name zhihur.com;

# 填写证书文件路径
ssl_certificate vhosts/cert/zhihur.com.pem;
# 填写证书私钥文件路径
ssl_certificate_key vhosts/cert/zhihur.com.key;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

# 自定义设置使用的 TLS 协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
# TLS 协议版本越高,HTTPS 通信的安全性越高,但是相较于低版本 TLS 协议,高版本 TLS 协议对浏览器的兼容性较差
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

# 表示优先使用服务端加密套件,默认开启
ssl_prefer_server_ciphers on;

location / {
# 通过 root 指定站点目录
root /workspace/draft;
# 或通过 proxy_pass 指定代理的地址
# proxy_pass http://127.0.0.1:3000/;
index index.html index.htm;
# limit_rate 1024k; # 1s limit 1MB
}
}
server {
listen 80;
# 填写证书绑定的域名
server_name zhihur.com;
# 将所有 HTTP 请求通过 rewrite 指令重定向到 HTTPS
rewrite ^(.*)$ https://$host$1;
location / {
index index.html index.htm;
}
}

多域多站点

基于域名的虚拟主机,用的比较多,重点掌握。

域名解析配置。

Nginx 配置

zhihur.conf

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
60
61
62
63
server {
# HTTPS 的默认访问端口 443
listen 443 ssl;

# 填写证书绑定的域名
server_name zhihur.com;

# 填写证书文件绝对路径
ssl_certificate vhosts/cert/zhihur.com.pem;
# 填写证书私钥文件绝对路径
ssl_certificate_key vhosts/cert/zhihur.com.key;

# ...

location / {
root /workspace/draft;
#proxy_pass http://127.0.0.1:3000;
index index.html index.htm;
}
}

server {
listen 80;
# 填写证书绑定的域名
server_name zhihur.com;
# 将所有 HTTP 请求通过 rewrite 指令重定向到 HTTPS
rewrite ^(.*)$ https://$host$1;
location / {
index index.html index.htm;
}
}

server {
# HTTPS 的默认访问端口 443
listen 443 ssl;

# 填写证书绑定的域名
server_name test.zhihur.com;

# 填写证书文件绝对路径
ssl_certificate vhosts/cert/test.zhihur.com.pem;
# 填写证书私钥文件绝对路径
ssl_certificate_key vhosts/cert/test.zhihur.com.key;

# ...

location / {
# root /workspace/a;
proxy_pass http://127.0.0.1:3000;
index index.html index.htm;
}
}


server {
listen 80;
server_name test.zhihur.com;
rewrite ^(.*)$ https://$host$1;
location / {
# root /workspace/b;
index index.html index.htm;
}
}

单域多站点

单域名的情况下,如何部署多站点?

通过端口号区分

基于端口号的虚拟主机,这种一般很少用,了解即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# http://zhihur.com:81/
server {
listen 81;
server_name zhihur.com;
location / {
root /workspace/a;
index index.html index.htm;
}
}
# http://zhihur.com:82/
server {
listen 82;
server_name zhihur.com;
location / {
root /workspace/b;
index index.html index.htm;
}
}

通过目录区分

zhihur.conf 的配置不变。

1
2
3
/workspace/draft/a/index.html
/workspace/draft/b/index.html
/workspace/draft/c/index.html

最基本部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 80;
# 填写自己的域名(会涉及到前面讲的域名解析和 SSL 证书配置)
server_name yourdomain.com;

location / {
#0
root /workspace/vue-project;
#1
try_files $uri $uri/ /index.html;
index index.html index.htm;
}

#2
location /api {
proxy_pass http://baidu.com;
}
}