目录结构

进入Nginx的主目录我们可以看到这些文件夹

  1. client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp

其中以temp结尾的文件夹在刚安装后是没有的,主要用来存放运行过程中的临时文件。

conf

用来存放配置文件相关

html

用来存放静态文件的默认目录 html、css等

sbin

nginx的主程序

基本运行原理

image.png

Nginx配置与应用场景

最小配置

worker_processes

worker_processes 1; 默认为1,表示开启一个业务进程

worker_connections

worker_connections 1024; 单个业务进程可接受连接数

include mime.types

include mime.types; 引入http mime类型

default_type application/octet-stream

default_type application/octet-stream; 如果mime类型没匹配上,默认使用二进制流的方式传输。

sendfile on

sendfile on; 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。
未开启sendfile
开启前
image.png
开启后
image.png

keepalive_timeout

keepalive_timeout 65

server

image.png
虚拟主机配置

  1. server {
  2. listen 80; 监听端口号
  3. server_name localhost; 主机名
  4. location / { 匹配路径
  5. root html; 文件根目录
  6. index index.html index.htm; 默认页名称
  7. }
  8. error_page 500 502 503 504 /50x.html; 报错编码对应页面
  9. location = /50x.html {
  10. root html;
  11. }
  12. }

虚拟主机

原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务

servername匹配规则

我们需要注意的是servername匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了。

完整匹配

我们可以在同一servername中匹配多个域名

  1. server_name vod.mmban.com www1.mmban.com;

通配符匹配

  1. server_name *.mmban.com
  2. server_name vod.*;

正则匹配

  1. server_name ~^[0-9]+\.mmban\.com$;

反向代理

  1. location / {
  2. proxy_pass http://atguigu.com/;
  3. }

基于反向代理的负载均衡

  1. upstream httpd {
  2. server 192.168.44.102:80;
  3. server 192.168.43.103:80;
  4. }

负载均衡策略

轮询

默认情况下使用轮询方式,逐一转发,这种方式适用于无状态请求。

weight(权重)

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

  1. upstream httpd {
  2. server 127.0.0.1:8050 weight=10 down;
  3. server 127.0.0.1:8060 weight=1;
  4. server 127.0.0.1:8060 weight=1 backup;
  5. }
  • down:表示当前的server暂时不参与负载
  • weight:默认为1.weight越大,负载的权重就越大。
  • backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。

    ip_hash

    根据客户端的ip地址转发同一台服务器,可以保持回话。

    least_conn

    最少连接访问

    url_hash

    根据用户访问的url定向转发请求

    fair

    根据后端服务器响应时间转发请求

    动静分离

    1 配置反向代理

    ```nginx location / { proxy_pass http://127.0.0.1:8080; root html; index index.html index.htm; }
  1. <a name="yCPgW"></a>
  2. ### 2 增加每一个location
  3. ```nginx
  4. location /css {
  5. root /usr/local/nginx/static;
  6. index index.html index.htm;
  7. }
  8. location /images {
  9. root /usr/local/nginx/static;
  10. index index.html index.htm;
  11. }
  12. location /js {
  13. root /usr/local/nginx/static;
  14. index index.html index.htm;
  15. }

使用一个location

location 前缀:

  • / 通用匹配,任何请求都会匹配到。
  • = 精准匹配,不是以指定模式开头
  • ~ 正则匹配,区分大小写
  • ~* 正则匹配,不区分大小写
  • ^~ 非正则匹配,匹配以指定模式开头的location

    location匹配顺序

  • 多个正则location直接按书写顺序匹配,成功后就不会继续往后面匹配

  • 普通(非正则)location会一直往下,直到找到匹配度最高的(最大前缀匹配)
  • 当普通location与正则location同时存在,如果正则匹配成功,则不会再执行普通匹配
  • 所有类型location存在时,“=”匹配 > “^~”匹配 > 正则匹配 > 普通(最大前缀匹配) ```nginx location ~*/(css|img|js) { root /usr/local/nginx/static; index index.html index.htm; }
  1. <a name="gDgxl"></a>
  2. ### alias与root
  3. ```nginx
  4. location /css {
  5. alias /usr/local/nginx/static/css;
  6. index index.html index.htm;
  7. }

root用来设置根目录,而alias在接受请求的时候在路径上不会加上location。
1)alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alias目录下查找的;
2)root指定的目录是location匹配访问的path目录的上一级目录,这个path目录一定要是真实存在root指定目录下的;
3)使用alias标签的目录块中不能使用rewrite的break(具体原因不明);另外,alias指定的目录后面必须要加上”/“符号!!
4)alias虚拟目录配置中,location匹配的path目录如果后面不带”/“,那么访问的url地址中这个path目录后
面加不加”/“不影响访问,访问时它会自动加上”/“; 但是如果location匹配的path目录后面加上”/“,那么访问的url地址中这个path目录必须要加上”/“,访问时它不会自动加上”/“。如果不加上”/“,访问就会失败!
5)root目录配置中,location匹配的path目录后面带不带”/“,都不会影响访问。

UrlRewrite

rewrite语法格式及参数语法

rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容,重定向到replacement,结尾是flag标记。

rewrite [flag]
关键字 正则 替代内容 flag标记
  • 关键字:其中关键字error_log不能改变
  • 正则:perl兼容正则表达式语句进行规则匹配
  • 替代内容:将正则匹配的内容替换成replacement
  • flag标记:rewrite支持的flag标记

rewrite参数的标签段位置:server,location,if
flag标记说明:

  • last #本条规则匹配完成后,继续向下匹配新的location URI规则
  • break #本条规则匹配完成即终止,不再匹配后面的任何规则
  • redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
  • permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

实例

  1. rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;

同时使用负载均衡

应用服务器防火墙配置

  1. # 开启防火墙
  2. systemctl start firewalld
  3. # 重启防火墙
  4. systemctl restart firewalld
  5. # 重载规则
  6. firewall-cmd --reload
  7. # 查看已配置规则
  8. firewall-cmd --list-all
  1. upstream httpds {
  2. server 192.168.44.102 weight=8 down;
  3. server 192.168.44.103:8080 weight=2;
  4. server 192.168.44.104:8080 weight=1 backup;
  5. }
  6. location / {
  7. rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 redirect;
  8. proxy_pass http://httpds ;
  9. }

防盗链配置

  1. valid_referers none | blocked | server_names | strings ....;
  • none, 检测 Referer 头域不存在的情况。
  • blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以“http://” 或 “https://” 开头。
  • server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。

在需要防盗链的location中配置

  1. valid_referers 192.168.44.101;
  2. if ($invalid_referer) {
  3. return 403;
  4. }