前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

1、基本命令

1.1、启动

Linux  ./nginx -c conf/nginx.conf
windows start nginx

1.2、停止

./nginx -s stop

1.3、有序退出

./nginx -s quit

1.4、配置修改后,重新载入

./nginx -s reload

1.5、重启

./nginx -s reopen  

1.6、检测配置文件

./nginx -t

1.7、平滑重启


kill -HUP nginx进程号
kill -HUP '/var/run/nginx.pid"

当nginx接收到HUP信号时,它会尝试先解析配置文件(如果指定文件,就使用指定的,否则使用默认的),如果成功,就应用新的配置文件(例如:重新打开日志文件或监听的套接字),之后,nginx运行新的工作进程并从容关闭旧的工作进程,通知工作进程关闭监听套接字,但是继续为当前连接的客户提供服务,所有客户端的服务完成后,旧的工作进程就关闭,如果新的配置文件应用失败,nginx继续使用之前的配置进行工作。

2、属性解释

2.1、listen 监听的端口;server_name 建议的域名或者ip

2.2、autoindex on;

  • 解释 :开启浏览功能,开启网站目录文件列表功能,访问目录时列出其中的文件列表,默认不开启

 server {
        listen       80;
        server_name  test.nginx.com;
        root   D:/nginx/;
        # 开启网站目录文件列表功能,访问目录时列出其中的文件列表,默认不开启  
        autoindex on; 
       
    }

  • 测试
http://test.nginx.com

1571991172801

2.3、index

  • 解释 :如果url没有匹配,则优先index文件,没有这个属性值也是默认会查找index.html文件
 server {
        listen       80;
        server_name  test.nginx.com;
        root   D:/nginx/;
        index  index.html index.htm;
        autoindex on; 
       
    }

  • 测试

我在root目录下放入一个index.html文件,并写入文件内容index

http://test.nginx.com

1571991233356

2.4、location匹配规则

2.4.1、匹配规则
模式 含义
location = /uri = 表示精确匹配,只有完全匹配上才能生效
location ^~ /uri ^~ 开头对URL路径进行前缀匹配,并且在正则之前。前缀匹配,如果有包含关系时,按最大匹配原则进行匹配。比如在前缀匹配:location /dir01location /dir01/dir02,如有请求 http://localhost/dir01/dir02/file 将最终匹配到 location /dir01/dir02
location ~ pattern 正则匹配:区分大小写的
location ~* pattern 正则匹配:不区分大小写的
location /uri 不带任何修饰符,也表示前缀匹配,在正则匹配之后
location /  
2.4.2、匹配顺序
  • 首先精确匹配 =
  • 其次前缀匹配 ^~
  • 其次是按文件中顺序的正则匹配
  • 然后匹配不带任何修饰的前缀匹配。
  • 最后是交给 / 通用匹配
  • 当有匹配成功时候,停止匹配,按当前匹配规则处理请求
2.4.3、测试

location = / {
   echo "规则A";
}
location = /login {
   echo "规则B";
}
location ^~ /static/ {
   echo "规则C";
}
location ^~ /static/files {
    echo "规则X";
}
location ~ \.(gif|jpg|png|js|css)$ {
   echo "规则D";
}
location ~* \.png$ {
   echo "规则E";
}
location /img {
    echo "规则Y";
}
location / {
   echo "规则F";

url 匹配规则  
http://localhost/ A  
http://localhost/login B  
http://localhost/register F  
http://localhost/static/a.html C  
http://localhost/static/files/a.exe X 虽然 规则C 也能匹配到,但因为最大匹配原则,最终选中了 规则X
http://localhost/a.gif D  
http://localhost/static/c.png C 规则C顺序优先 ,规则E不起作用
http://localhost/a.PNG E 规则 E 不区分大小写。
http://localhost/img/a.gif D 虽然 规则Y 也可以匹配上,但是因为正则匹配优先,而忽略了 规则Y。
http://localhost/img/a.tiff Y  

2.5、 日志记录

2.5.1、默认日志

虽然下面的log_format的注释没有打开,但是也是有日志查看的在logs文件夹下,下面的log_format开启是自定义日志支持

1571994776277

2.5.2、打开自定日志支持

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

2.5.2.1、自定义日志的目录和文件

配置自定义日志之后,我们访问当前的server就不会进入上面的日志文件中了

 server {
        listen       80;
        server_name  test.nginx.com;

        access_log  D:/nginx/log/access.log  ; //默认是main级别的,我们一般生成设置这个就可以了
      

        root   D:/nginx/;
        index  index.html index.htm;
       
    }
127.0.0.1 - - [25/Oct/2019:17:14:09 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
127.0.0.1 - - [25/Oct/2019:17:14:12 +0800] "GET /1111111111111 HTTP/1.1" 404 555 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"

2.5.2.2、添加多个自定义级别
server {
        listen       80;
        server_name  test.nginx.com;

        access_log  D:/nginx/log/access.log  main;
        error_log   D:/nginx/log/error.log   warn;

        root   D:/nginx/;
        index  index.html index.htm;
       
    }

分别访问正常的url和错误的404url

1571995635850

1571995733276

  • access.log
127.0.0.1 - - [25/Oct/2019:17:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" "-"
127.0.0.1 - - [25/Oct/2019:17:28:19 +0800] "GET /1111111111111 HTTP/1.1" 404 555 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" "-"

  • error_log
2019/10/25 17:28:19 [error] 7856#9844: *2 CreateFile() "D:/nginx/1111111111111" failed (2: The system cannot find the file specified), client: 127.0.0.1, server: test.nginx.com, request: "GET /1111111111111 HTTP/1.1", host: "test.nginx.com"


2.6、自定义错误页面

注意目录和文件名

error_page   500 502 503 504  /50x.html; 
proxy_intercept_errors on;
  location = /50x.html {
   root   html;
}

1571996031462

server {
        listen       80;
        server_name  test.nginx.com;

        access_log  D:/nginx/log/access.log  main;
        error_log   D:/nginx/log/error.log   warn;

        root   D:/nginx/;
        index  index.html index.htm;
       
        error_page   500 502 503 504  /50x.html;
        proxy_intercept_errors on;
        location = /50x.html {
            root   html;
        }
    }

2.7、alias 别名(注意是目录)

location /name/ {
      alias /home/www/huan/;
}


访问http://test.nginx.com/name/a.html实际指定的是/home/www/huan/a.html。
注意:alias指定的目录后面必须要加上"/",即/home/www/huan/不能改成/home/www/huan


上面的配置也可以改成root目录配置,
location /name/ {
  root /home/www/;
}

2.8、控制站点访问

    # 控制站点访问
         location /NginxDeny {
            deny 127.0.0.1;
            allow 128.163.0.0/24;
            allow 128.163.1.1;
            deny all;

        }

2.9、nginx地址重写

  • last: 本条规则匹配完成后,继续向下匹配新的location URI规则

  • break:本条规则匹配完成后,终止匹配,不再匹配后面的规则,浏览器地址栏URL地址不变

  • redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址,返回302状态码

  • permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,返回301状态码 

302临时性重定向:对旧网址没有影响,但新网址不会有排名 ,301永久性重定向:新网址完全继承旧网址,旧网址的排名等完全清零

2.9.1、last和break区别和联系

  1. last 和 break 当出现在location 之外时,两者的作用是一致的没有任何差异。

  2. last 和 break 当出现在location 内部时,两者就存在了差异

last: 使用了last 指令,rewrite 后会跳出location 作用域,重新开始再走一次刚刚的行为,

break: 使用了break 指令,rewrite后不会跳出location 作用域。它的生命也在这个location中终结。



last: 重新将rewrite后的地址在server标签中执行,last一般写在server和if中,而break一般使用在location中
 
break: 将rewrite后的地址在当前location标签中执行


2.9.1.1、测试

在root文件夹下创建文件q.html,写入内容 qqqqqqqqq

WX20191027-150009@2x



   server {
       listen       80;
       server_name  test.nginx.com;

       access_log  /Users/healerjean/Desktop/root/access.log  main;
       error_log   /Users/healerjean/Desktop/root/error.log   warn;

       root /Users/healerjean/Desktop/root/    ;
 

       location / {
           rewrite /last/   /q.html last;
           rewrite /break/  /q.html break;
       }
   
       location = /q.html {
           return 400;
       }

   }


  • 浏览器访问 http://test.nginx.com/q.html

WX20191027-145122@2x

  • 浏览器访问 http://test.nginx.com/last/ http://test.nginx.com/last/fasdf

  • 浏览器访问 http://test.nginx.com/break/ http://test.nginx.com/break/fasdfa

2.9.1.2、总结

访问/last/时重写到/q.html,然后使用新的uri再匹配,正好匹配到locatoin = /q.html然后返回了400

访问/break时重写到/q.html,由于返回了break,则直接停止了

2.9.2、permanent 测试

  server {
            listen       80;
            server_name  test.nginx.com;

            access_log  /Users/healerjean/Desktop/root/access.log  main;
            error_log   /Users/healerjean/Desktop/root/error.log   warn;

            root /Users/healerjean/Desktop/root/    ;
 

            location / {
                rewrite /permanent/   /q.html permanent;
            }
   
        }

浏览器输入: http://test.nginx.com/permanent/,会自动调整成 http://test.nginx.com/q.html

2.9.3、其他说明

$ 匹配字符串的结尾 $1 正则变量的值,$1表示第一个()内的正则匹配内容,$2为第二个

last和break一般作用于server内部,不要使用域名重写它,这样浏览器会显示域名



server {
  listen       80 ;
  server_name     test.nginx.com ;
  
  proxy_set_header Host $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;
  
  return 301 http://graceway.m.duoqugame.net$request_uri;
  
   # 最早支持的写法
# rewrite ^(.*)$ https://$host$1 permanent;               
  
# 这是nginx最新支持的写法
# return 301 https://$host$request_uri;

}
2.9.3.1、根据不同浏览器地址重写
  if ($http_user_agent ~* "Firefox")  {   
      rewrite ^(.*)$ /NginxFirefoxRewrite/$1  break;
  }
        
        
2.9.3.2、 $host根据域名地址重写

if ($host = www.liuli.com' ) {
   rewrite ^/(.*)$ http://www.heaeljean.com/$1 permanent;
}
   

2.10、nginx限速

优先下载10m的内容,当下载到10m后开始,限速10k 这里面有提供下载的资源


    location /NginxDownLoad {
            limit_rate_after 10m;
            limit_rate 10k; 
        }

2.11、负载均衡

设备的状态有:  
1、down 表示单前的server暂时不参与负载 
2、weight 权重,默认为1。 weight越大,负载的权重就越大。 
3、max_fails 允许请求失败的次数默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误 
4、fail_timeout max_fails次失败后,暂停的时间。 
5、backup 备用服务器, 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。-


upstream backend {
    server 127.0.001:8010 weight=1 max_fails=2 fail_timeout=30s;
    server 127.0.0.1:8011 weight=1 max_fails=2 fail_timeout=30s;
}

server {
        listen 80;

        proxy_set_header Host $host:8010;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Real-IP  $remote_addr;


        location  / {
             proxy_pass http://backend;
        }
   }
   

2.11.1、轮询(weight=1) 


解释:默认选项,当weight不指定时,各服务器weight相同, 
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream bakend { 
    server 192.168.1.10; 
    server 192.168.1.11; 
} 


2.11.2、weight 权重


解释:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 
如果后端服务器down掉,能自动剔除。 
比如以下配置,则1.11服务器的访问量为1.10服务器的两倍。

upstream bakend { 
    server 192.168.1.10 weight=1; 
    server 192.168.1.11 weight=2; 
} 

2.11.3、ip_hash 


解释:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session不能跨服务器的问题。 

如果后端服务器down掉,要手工down掉。

upstream resinserver{ 
    ip_hash; 
    server 192.168.1.10:8080; 
    server 192.168.1.11:8080; 
} 

2.11.4、 fair(第三方插件) 


解释:按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream resinserver{ 
    server 192.168.1.10:8080; 
    server 192.168.1.11:8080; 
    fair; 
} 

2.11.5、url_hash(第三方插件) 


解释:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存服务器时比较有效。 


upstream resinserver{ 
    server 192.168.1.10:8080; 
    server 192.168.1.11:8080; 
    hash $request_uri; 
    hash_method crc32; 
}

2.12、不停网更新

upstream backend {
	server 192.168.198.128:8080 weight=1;
	server 192.168.198.128:8090 weight=4;
	server 192.168.198.128:8091 backup;
	}
	
server {
	listen 80;
	server_name localhost;
	
	location / {
	   root html;
	   index index.html index.htm;
	   proxy_pass http://backend;
	}
	
	
  1. 服务器1、服务器2和服务器3都正常启动,我刷新页面,会按照权重规则请求服务器1和服务器2,并不会请求服务器3(备份服务器)。

  2. 接下来我把服务器1停掉,服务器2和服务器3都正常启动,我刷新页面,这个时候所有请求都是服务器2,也并不会请求服务器3(备份服务器)。

  3. 接下来我把服务器1、服务器2都停掉,服务器3正常启动,我刷新页面,所有请求都转发到服务器3(备份服务器),看图片:

  4. 我再次依次启动服务器1和服务器2,所有请求都又按照权重规则分配了。在你所有正常服务器都挂掉时,系统依然高可用,这就是备份服务器的用处!

2.13、添加多个conf文件

1、在nginx安装目前下 新建 vhost 文件夹,在文件下创建 *.conf 的文件 ,如 video.haile.com.conf ,命名规则大多以域名的方法来命名文件。

2、编辑 conf 文件,把我们平常放在 nginx.conf 里的 server{...}  段复制过来直接粘贴到 conf 里。

3、在 nginx.conf 的 http{...} 段中加入   include E:/nginx-1.8.1/vhosts/*.conf;

注:这里 include 需要用到全路径,且文件后缀是用 conf

2.14、变量说明


#设置主机头和客户端真实地址,以便服务器获取客户端真实IP
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header           Host $host; 
proxy_set_header           X-Real-IP $remote_addr; 
#记录远程的ip
proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;

3、域名配置


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

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

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

3.1、地址重写

	server {
			listen       80 ;
			server_name     duodian.cai.dangqukeji.cn ;
			
			proxy_set_header Host $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;
			
			return 301 http://graceway.m.duoqugame.net$request_uri;
			
			 # 最早支持的写法
         # rewrite ^(.*)$ https://$host$1 permanent;               
       
         # 这是nginx最新支持的写法
         # return 301 https://$server_name$request_uri;      
         # return 301 https://$host$request_uri;

}



3.2、反向代理

   server {
        listen       80;
        server_name  xiaodang.m.duoqushop.com;

        proxy_set_header Host $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;


        location / {
          proxy_pass http://proxy.m.fqapps.com;
        }
		}
		

3.3、负载均衡

  upstream mysite {  
     server 47.104.466.466:8080 ;  
     server 47.104.122.122:8080 backup;   
   }


    server {
        listen       80;
        server_name  server.healerjean.cn;

        proxy_set_header Host $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;

                   
        location / {
         proxy_pass http://mysite;

        }
    }

2.4、部署前端代码(root.txt可以直接放到目录下面)



server {
            listen       80;
            server_name  info.healerjean.cn infomsg.healerjean.cn infoquan.healerjean.cn ;

            root        /usr/local/VueWebInfoProject/;
            index       index.html,index.htm;

            proxy_set_header Host $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;
         
            location / {
                try_files $uri /index.html;
            }
     }

2.5、验证根目录已经返回我自己的文字

server {
        listen       80;
        server_name  kequyh.m.dangquyouhui.cn ;

        proxy_set_header Host $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;

       location = /root.txt {
            default_type text/html;
            return 200 '32f9262143d2479080df590b3cff55f4';  
        }

        location / {
          proxy_pass http://proxy.m.fqapps.com;
        }
}

2.6、同时配置前后端访问



upstream backend {
        server 10.10.10.10:8031 weight=1 max_fails=2 fail_timeout=30s; 
        server 10.10.10.11:8031 weight=1 max_fails=2 fail_timeout=30s; 
}

server {
        listen 9999;
	    #如果端口不会冲突 可以不写  server_name  120.131.9.128; 
        access_log  /usr/local/service/log/nginx/scf_manager.log ;

        proxy_set_header Host $host:9999; # host一般只有域名,没有端口,
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Real-IP  $remote_addr;


        root /usr/local/service/app/scf/scf-manager-webapp/;

        location ~ ^/api/ {
            set $xlocation 'fintech'; # 配置一个变量
            proxy_pass http://backend;
        }

        location / {
            try_files $uri $uri/ /index.html;

        }


        location ~ ^/\. {
                deny all;
        }

        error_page   500 502 503 504  /50x.html;
        proxy_intercept_errors on;
        location = /50x.html {
            root   html;
        }
}

2.7、本地配置前后端项目


server {


        listen       80;
        server_name  scf-manage-web;
    
        #后台
        location /api {
         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_buffering off;

         proxy_pass http://127.0.0.1:8084/api;
         proxy_set_header Cookie $http_cookie;

        }
      
        # 前端
        location / {
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_buffering off;

         proxy_pass http://127.0.0.1:8086;
         proxy_set_header Cookie $http_cookie;

        }
    }
    

ContactAuthor