Nginx (engine x) 是一个高性能的HTTP服务器和反向代理服务器。
默认可执行文件路径
默认配置文件路径
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表示找不到文件或者资源。
检查配置文件正确性
以不中断服务的方式重新加载配置文件
记录一些实际使用中服务器的配置示例
代理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/; } }