nginx配置

Nginx (engine x) 是一个高性能的HTTP服务器和反向代理服务器。

默认可执行文件路径

1
/usr/sbin/nginx

默认配置文件路径

1
/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
...
http {
...
##
# Logging Settings
##

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
...
##
# Virtual Host Configs
##

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

可以看到默认的访问日志路径和错误日志路径:

1
/var/log/nginx/access.log
1
/var/log/nginx/error.log

当访问出错时可以通过这两个日志来分析原因。

nginx配置文件支持include的方式实现多配置文件管理,这样我们可以把不同站点或不同服务配置在单独的文件中。

/etc/nginx/conf.d/ 目录下的所有 .conf文件和 /etc/nginx/sites-enabled/ 目录下的所有文件内容都会被包含作为配置。

/etc/nginx/conf.d/ 默认是空的,/etc/nginx/sites-enabled/ 下有一个default文件软链接指向/etc/nginx/sites-available/default

我们也可以采取这种方式,在/etc/nginx/sites-available/目录下创建不同的需要被代理服务配置,然后通过软链接控制是否启用。

来看一下

1
/etc/nginx/sites-enabled/default

文件的主要内容

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
...
# Default server configuration
#
server {
listen 80 default_server;
listen [::]:80 default_server;
...
root /var/www/html;

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

server_name _;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
...
}

# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
# listen 80;
# listen [::]:80;
#
# server_name example.com;
#
# root /var/www/example.com;
# index index.html;
#
# location / {
# try_files $uri $uri/ =404;
# }
#}

我们看到这里有两个server{}块,一个server{}块就是一个服务器配置,上面部分是一个默认服务器的配置,在安装nginx之后访问 http://localhost 可以看到的默认页面就是通过这里的配置,下面部分(被注释掉的)是一个简单的web服务器配置样例。

listen 80 default_server; 是监听所有IPv4的80端口,也可以绑定IP地址 listen 127.0.0.1:80 这样服务器就只绑定了localhost的80端口,只能通过本地访问web服务,default_server用于表示这个server是默认server,当配置的多个server都绑定到了80端口,首先会通过匹配server_name来转发请求,如果没有找到匹配的则会使用 default_server ,如果没有配置 default_server ,则会使用 server_name _; 如果有找到 server_name _; 则会使用配置文件排序第一的第一个server块。

listen [::]:80 是配置监听所有的IPv6的80端口。

root /var/www/html; 是配置网站文件的根路径,多个站点可以在/var/www/下创建不同的目录作为根,如果作为反向代理服务器,可以没有root配置。

index index.html 是配置网站默认访问的文件名,当我们的URL没有以文件名结尾时会自动尝试访问配置的默认文件名,例如我们访问http://www.baidu.com 其实是访问到了 http://www.baidu.com/index.html 也就是网站根下的index.html 文件,如果作为反向代理服务器,可以没有index配置。

location / {}块,/ 用于匹配请求的 URI,如果匹配成功就用 {}块中的配置去处理。

比如 http://kyo86.com/archives http是协议,kyo86.com是域名,/archives是URI。

location 匹配的方式有多种:

  • 精准匹配
  • 正则匹配
  • 前缀匹配

其语法如下

1
location [ = | ~ | ~* | ^~ ] uri {...}

其中各个符号的含义:

  • =:精准匹配
  • ~:区分大小写的正则匹配;
  • ~*:不区分大小写的正则匹配;
  • ^~:匹配 URI 的前缀;

默认就是前缀匹配,但是和^~的优先级不同,当一个地址可以匹配多条location配置时,按如下顺序匹配:

=,^~ 匹配最长的,~ 匹配最前的,~* 匹配最前的,无修饰符的

所以location / {} 相当于是一个保底匹配,优先级最低的通用匹配。

用例:

匹配前后端分离时对后端api的请求,这里的用法就是反向代理服务器

1
2
3
4
5
6
7
8
9
location ^~/api/ {
proxy_pass http://localhost:8082/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;

rewrite ^/api/(.*)$ /$1 break;
}

匹配特定扩展名的请求

1
location ~* \.(gif|jpg|jpeg)$ {...}

try_files $uri $uri/ =404; 定义了尝试访问文件的方式,还是拿 http://kyo86.com/archives 举例,$uri的意思是拿/archives去root路径下查找文件,如果没有找到尝试$uri/ 它的意思是去root目录下的/archives/ 目录下,再根据index配置的文件去逐一查找,如果还是没有找到,=404的意思是跳转到404错误页,HTTP状态码404表示找不到文件或者资源。

检查配置文件正确性

1
nginx -t

以不中断服务的方式重新加载配置文件

1
nginx -s reload

记录一些实际使用中服务器的配置示例

代理ngrok服务器配置(这里server_name可以配置多个,而且其中一个是带*的,称为泛域名)

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 172.19.64.114:80 default_server;
server_name *.ngrok.kyo86.com ngrok.kyo86.com;
location / {
proxy_pass http://127.0.0.1;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 120;
}
}

代理jupyter服务器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 172.19.64.114:80;
server_name jupyter.kyo86.com;
location / {
proxy_pass http://localhost:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}

hexo博客服务器配置

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 172.19.64.114:80;
server_name kyo86.com www.kyo86.com;
root /var/www/hexo;

index index.html index.htm;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}

这是另一台服务器上配置了一个前后端分离的公司内部使用的WEB管理后台,后端服务器在30101端口。

前端用了htpasswd配置了基本的密码认证(搜索htpasswd可以得到配置用户名密码的方法)

后端用allow,deny控制允许访问的IP。

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
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm;

server_name _;

location / {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;

try_files $uri $uri/ =404;
}
location ^~/api/ {
allow 127.0.0.1/32;
allow 192.168.0.0/16;
deny all;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;

rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://localhost:30101/;
}
}