# nginx-demo **Repository Path**: valten/nginx-demo ## Basic Information - **Project Name**: nginx-demo - **Description**: Nginx从听说到放弃 - **Primary Language**: HTML - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2019-11-30 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # # nginx-demo >启动json-server > 指定端口8081 ## 1、Nginx介绍 Nginx(`engine x`)是一个高性能的HTTP服务器(其实不止HTTP服务器),一般主要用作**负载均衡**和**反向代理** ## 2、Nginx配置 ### **反向代理配置:** ```sh server { listen 80; location / { proxy_pass http://192.168.0.112:8080; # 应用服务器HTTP地址 } } ``` ### **负载均衡配置:** ```sh upstream mysvr { server 192.168.0.111:8080 weight=1; # 应用服务器1 server 192.168.0.112:8080 weight=3; # 应用服务器2 } server { listen 80; location / { proxy_pass http://mysvr; } } ``` **upstream 每个设备的状态:** - down :表示单前的server暂时不参与负载。 - weight :默认为1,weight越大,负载的权重就越大。 - max_fails :允许请求失败的次数默认为1,当超过最大次数时,返回proxy_next_upstream 模块定义的错误。 - fail_timeout:max_fails 次失败后,暂停的时间。 - backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。 #### 举个栗子: ##### *nginx.conf* ```sh upstream mycluster{ server 192.168.40.25:8080; server 192.168.40.26:8080; } server { listen 80; server_name localhost; location / { proxy_pass http://mycluster; include D:\Program\Nginx\proxy.conf; } #静态文件交给nginx处理 location ~ .*\.(html|js|gif|jpg|jpeg|png|bmp|rar|zip|txt|css|xls|mp4)$ { root E:\htmis\webapp; expires 3d; index index.html; } } ``` ##### *proxy.conf* ```sh 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; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffers 8 8k; ``` ### 虚拟主机配置 ```sh server { listen 80 default_server; server_name _; return 444; # 过滤其他域名的请求,返回444状态码 } server { listen 80; server_name www.aaa.com; # www.aaa.com域名 location / { proxy_pass http://localhost:8080; # 对应端口号8080 } } server { listen 80; server_name www.bbb.com; # www.bbb.com域名 location / { proxy_pass http://localhost:8081; # 对应端口号8081 } } ``` ### 路径重写 1、rewrite指令语法 > 指令语法: rewrite regex replacement [flag] > 默认值: none > 应用位置:server、location、if > > rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分的内容,重定向到replacement部分,结尾是flag标记。 > 下面是一个简单地URL rewrite跳转的例子: ```sh rewrite ^/(.*) http://www.etiantian.org/$1 permanent; ``` 2、rewrite指令结尾的flag标记说明 | flag标记符号 | 说 明 | | ------------ | ---------------------------------------------------- | | last | 本条规则匹配完成后,继续向下匹配新的location URI规则 | | break | 本条规则匹配完成即终止,不再匹配后面的任何规则 | | redirect | 返回302临时重定向,浏览器地址栏会显示跳转后的URL地址 | | permanent | 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址 | 在以上的flag标记中,last和break用来实现URL重写,浏览器地址栏的URL地址不变,但在服务器访问的程序及路径发生了变化。redirect和permanent用来实现URL跳转,浏览器地址会显示跳转后的URL地址。 last和break标记的实现功能类似,但二者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记。last标记在本条rewrite规则执行完毕后,会对其所在的server{…}标签重新发起请求,而break标记则会在本条规则匹配完成后,终止匹配,不再匹配后面的规则。 举个栗子 ```conf if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } //如果UA包含"MSIE",rewrite请求到/msid/目录下 if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } //如果cookie匹配正则,设置变量$id等于正则引用部分 if ($request_method = POST) { return 405; } //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302 if ($slow) { limit_rate 10k; } //限速,$slow可以通过 set 指令设置 if (!-f $request_filename){ break; proxy_pass http://127.0.0.1; } //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查 if ($args ~ post=140){ rewrite ^ http://mysite.com/ permanent; } //如果query string中包含"post=140",永久重定向到mysite.com ``` ## 3、nginx常用命令 | 命令 | 注释 | | --------------- | ------------------------------------ | | nginx | 启动nginx,按照默认路径 | | nginx -t | 测试配置正确性、也可查询默认配置路径 | | nignx -c 路径 | 按照指定路径启动 | | nginx -s reload | 平滑重启 | | nginx -s stop | 停止nginx | | nginx -v | 显示 nginx 的版本 | | nginx -V | nginx 的版本,编译器版本和配置参数。 |