IP捆绑域名

访问域名,打开指定的静态html页面
前提:先把域名解析到ip下,才能捆绑使用
server_name :这里配置自己的域名

1
2
3
4
5
6
7
8
9
server {
listen 80;
# server_name www.renyuxin.cn; # 域名
server_name 127.0.0.1; # ip
location / {
root html;
index index.html index.htm;
}
}

代理转发

访问资源目录

使用域名或ip,访问服务器文件夹。域名 + /静态资源相对路径

1
2
3
4
5
6
server{
listen 80;
# server_name file.renyuxin.cn; # 域名
server_name 127.0.0.1; # ip
root /usr/local/nginx/html/files;
}

访问HTML

ip或域名直接访问服务器上的index.html

1
2
3
4
5
6
7
8
9
server{
listen 80;
# server_name file.renyuxin.cn; # 域名
server_name 127.0.0.1; # ip
location ~^/ {
root html;
index index.html index.htm;
}
}

同一台服务器下,使用不同域名,访问不同文件夹下的默认html页面
注意,root:对应的文件夹路径,是服务器中的绝对路径,不是以/ngixn/html文件夹的相对路径。
并且 index:输入域名,默认跳转的页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server{
listen 80;
server_name aaa.renyuxin.cn;
location / {
root /demo/one;
index index.html;
}
}
server{
listen 80;
server_name bbb.renyuxin.cn;
location / {
root /demo/two;
index index.html;
}
}

域名转端口

同一台服务器下,使用不同域名,通过不同端口,访问不同的项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server{
listen 80;
server_name blog.renyuxin.cn;
location ~^/ {
proxy_pass http://127.0.0.1:8001;
}
location /soulsoup/ {
proxy_pass http://127.0.0.1:8001/soulsoup;
}

}

server{
listen 80;
server_name blog2.renyuxin.cn;
location ~^/ {
proxy_pass http://127.0.0.1:8002;
}
location /soulsoup/ {
proxy_pass http://127.0.0.1:8002/soulsoup;
}

}

强制转发

  • 场景1:由于访问http协议不安全,强制将server_name的域名或ip转成https协议
    例如:访问http://blog.renyuxin.cn自动跳转访问https://blog.renyuxin.cn
  • 场景2:将https页面中的所有http请求转换成https请求。在日常开发过程中,经常会遇到https中出现http请求,由于安全策略问题,导致无法访问。所以就需要在nginx端将http强制转为https请求。
    例如:在https://blog.renyuxin.cn的页面中,出现了 http://8.123.456.789:8001/getList 这样的请求,但是这个请求无法访问,所以需要强制转为:https://blog.renyuxin.cn:8001/getList
1
2
3
4
5
server {
listen 80;
server_name blog.renyuxin.cn 8.123.456.789; # 监听 域名/ip,用空格间隔,支持通配符
rewrite ^(.*) https://$server_name$1 permanent; # 将所有HTTP请求永久重定向到HTTPS
}

有些项目可能会遇到重复CORS冲突,那么就需要将后端返回的CORS头移除,解决跨域问题
可以在server的location中添加如下代码,即可移除后端返回的CORS头。

1
2
3
4
5
6
# 移除后端返回的 CORS 头
proxy_hide_header 'Access-Control-Allow-Origin';
# 跨域支持
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type';

Stream端口转发

大陆域名转发到海外服务器的操作,常用于:
当本地直接ping海外出现丢包甚至超时的时候,大陆服务器当跳板,转海外服务器

listen:后面填写源端口(也就是当前服务器端口),默认协议为TCP,可以指定为UDP协议
proxy_connect_timeout:连接超时时间
proxy_timeout:超时时间
proxy_pass:填写转发目标的IP及端口号

注意:Ngixn可以将IPV4的数据包转发到IPV6IPV6IP需要使用[]括起来。

参考【关于Nginx中Stream模块配置
参考【官方文档

源码

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
stream {
upstream backend {
hash $remote_addr consistent;

server backend1.example.com:12345 weight=5;
server 127.0.0.1:12345 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}

upstream dns {
server 192.168.0.1:53535;
server dns.example.com:53;
}

server {
listen 12345;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass backend;
}

server {
listen 127.0.0.1:53 udp reuseport;
proxy_timeout 20s;
proxy_pass dns;
}

server {
listen [::1]:12345;
proxy_pass unix:/tmp/stream.socket;
}
}

案例实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
stream {
#将12345端口转发到192.168.1.23的3306端口
server {
listen 12345;
proxy_connect_timeout 5s;
proxy_timeout 20s;
proxy_pass 192.168.1.23:3306;
}
#将udp 53端口转发到192.168.1.23 53端口
server {
listen 53 udp reuseport;
proxy_timeout 20s;
proxy_pass 192.168.1.23:53;
}
#ipv4转发到ipv6
server {
listen 9135;
proxy_connect_timeout 10s;
proxy_timeout 30s;
proxy_pass [2607:fcd0:107:3cc::1]:9135;
}
}

域名访问,路由转发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server{
listen 80;
server_name blog.renyuxin.cn;

location / {
root /demo/dist;
index index.html;
try_files $uri $uri/ /index.html;
}
# prod-api路由
location /prod-api/{
proxy_pass http://127.0.0.1:8001/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 移除后端返回的CORS头(按需配置)
# proxy_hide_header 'Access-Control-Allow-Origin';
}

}

综合问题

访问svg资源

nginx启动成功,jpg、png等静态资源可以正常访问,但是svg格式不能访问

1
2
3
4
5
6
7
8
server{
listen 80;
server_name file.renyuxin.cn;
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|js|pdf|txt|svg){
root /usr/local/nginx/html/file;
add_header Access-Control-Allow-Origin *;
}
}

访问文件存储路径

如果在服务器上建了一个存储目录,一般存储各种格式的文件,现在需要从网页上访问这个存储目录,下面这个配置可以解决

ps:如果想强制下载指定文件,就需要添加add_header Content-Disposition 'attachment; filename="$arg_filename"';这个代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 配置文件下载路径
location /files/ {
autoindex on; # 可选,开启目录列表
autoindex_exact_size off; # 显示文件的具体大小
autoindex_localtime on; # 显示本地时间
# 指定文件类型
types {
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
application/vnd.ms-excel xls;
}
# 强制浏览器下载文件
add_header Content-Disposition 'attachment; filename="$arg_filename"'; # 强制下载
# add_header Content-Disposition 'attachment'; # 非强制下载
}

特定文件类型 types,还有其他类型,可以参考下面这个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
text/plain txt;
text/html html htm;
text/css css;
application/javascript js;
application/json json;
image/jpeg jpg jpeg;
image/png png;
image/gif gif;
image/svg+xml svg;
image/webp webp;
audio/mpeg mp3;
video/mp4 mp4;
application/pdf pdf;
application/zip zip;
application/x-tar tar;
application/gzip gz;
application/vnd.ms-excel xls;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
application/msword doc;
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
application/vnd.ms-powerpoint ppt;
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx;