2.我在B站学运维之Nginx反代服务器基础配置实践案例
全栈工程师修炼指南
2022年04月15日 15:27
收录于文集
共63篇

帅哥(靓仔)、美女,点个关注后续不迷路!

本章目录


  • 5.Ngin配置实例

    • 5.1 反向代理

    • 5.2 正向代理

    • 5.3 负载均衡

    • 5.4 HTTP服务器

    • 5.5 动静资源分离

    • 5.6 请求转发案例

    • 5.7 错误页面跳转设置

    • 5.8 阻止特定URL访问

  • 6.附录

    • 6.1 自启动脚本

    • 6.2 学习思考


原文地址:https://blog.weiyigeek.top/2019/9-1-121.html


5.Ngin配置实例

5.1 反向代理

描述:反向代理是指以代理服务器来接受连接请求,然后将给内部网络上的服务器,并将从服务器上得到的结果返回给请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器,而且整个过程对于客户端而言是透明的。

简单来说就是,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,或同一台服务器不同端口。

客户端 -(外围)- NGINX(代码服务器) --- 内网服务端

配置实例:

代码块
JavaScript
自动换行
复制代码
server {  
  listen   80;   #nginx 服务端 请求端口
  server_name  weiyigeek.top;          
  client_max_body_size 1024M;
  location / {   #匹配指向请求URL后的路径,可以多个
    proxy_pass http://weiyigeek.top:8080; 
     #URL后缀不得以在端口后加个工程目录
    proxy_set_header Host $host:$server_port;
  }
}
复制成功

5.2 正向代理

描述:正向代理意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后

简单的说类似于采用VPN来访问google:

代码块
JavaScript
自动换行
复制代码
resolver 114.114.114.114 8.8.8.8;
    server {
        resolver_timeout 5s;
        listen 81;
        access_log  e:wwwrootproxy.access.log;
        error_log   e:wwwrootproxy.error.log;
        location / {
            proxy_pass http://$host$request_uri;
        }
    }
复制成功

注:负载均衡通常使用正向代理加upstream的方式

5.3 负载均衡

描述:负载均衡也是Nginx常用的一个功能。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。

而Nginx目前支持自带3种负载均衡策略还有2种常用的第三方策略。

负载均衡调用中状态:

  • down : 当前server暂不参与负载均衡

  • backup : 预留的备份服务器

  • max_fails : 请求失败次数限制

  • fail_timeout : 经过max_fails后服务暂停时间

  • max_conns : 限制最大的连接数

简单示例:

代码块
JavaScript
自动换行
复制代码
upstrem weiyigeek {
  server weiyigeek.top:8080 down;
  server weiyigeek.top:8081 backup;
  server weiyigeek.top:8082 max_fails=1 fail_timeout=10s max_conns=1024;
  server unix:/tmp/backend3;
}
复制成功

调度算法:

  • 轮询:默认算法按时间顺序逐一分配到不同的后端服务器;

  • 加权轮询:Weight值越大,分配到访问几率越高;

  • ip_hash:为每一个请求访问的IP的hash结果分配,可以将来自一个IP的固定访问一个后端服务器;

  • url_hash:需要安装模块安装访问的URL的hash结果来分配,这样每个URL定向到同一个后端服务器

  • least_conn:按照某台机器最少连接数的进行分配访问;

  • hash关键数值: hash 自定义 KEY

方式1: 轮询 RR(默认轮询)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉能自动剔除。

代码块
JavaScript
自动换行
复制代码
upstream test {
  server weiyigeek.top:8080;
  server weiyigeek.top:8081;
}

server {
  listen  81;  
  server_name  weiyigeek.top;                                 
  client_max_body_size 1024M;
  location / {
    proxy_pass http://test;
    proxy_set_header Host $host:$server_port;
  }
}
复制成功

方式2:权重 权重指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如

代码块
JavaScript
自动换行
复制代码
upstream test {
  server weiyigeek.top:8081 weight=1;
  server weiyigeek.top:8080 weight=9;  #那么10次一般只会有1次会访问到8081,而有9次会访问到8080
}
复制成功

方式3: ip_hash ip_hash 会话粘连, 上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

代码块
JavaScript
自动换行
复制代码
# 会话粘粘可以理解为用户持续访问一个后端机器
upstream test {
  ip_hash;
  server weiyigeek.top:8080;
  server weiyigeek.top:8081;
}
复制成功

方式4:fair fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。

代码块
JavaScript
自动换行
复制代码
upstream backend { 
  fair; 
  server weiyigeek.top:8080;
  server weiyigeek.top:8081;
} 
复制成功

方式5:url_hash url_hash(第三方):按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,

代码块
JavaScript
自动换行
复制代码
upstream backend { 
  hash $request_uri; 
  hash_method crc32; 
  server weiyigeek.top:8080;
  server weiyigeek.top:8081;
} 
复制成功

方式6:url_hash 描述: 将请求分配到连接数最少的服务上。

代码块
JavaScript
自动换行
复制代码
upstream  dalaoyang-server {
  least_conn;
  server    weiyigeek.top:10001;
  server    weiyigeek.top:10002;
}
复制成功

以上6种负载均衡各自适用不同情况下使用,所以可以根据实际情况选择使用哪种策略模式,.

5.4 HTTP服务器

Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现,首先看看Nginx做静态资源服务器;

代码块
JavaScript
自动换行
复制代码
server {
  listen 80; 
  server_name  weiyigeek.top;                                       
  client_max_body_size 1024M;
  location / {
    root   e:wwwroot;
    index  index.html;
  }
}
复制成功

访问就会默认访问到E盘wwwroot目录下面的index.html,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。

5.5 动静资源分离

动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以,这就是网站静态化处理的核心思路;

代码块
Shell
自动换行
复制代码
upstream test{  
  server weiyigeek.top:8080;  
  server weiyigeek.top:8081;  
}   

server {  
  listen       80;  
  server_name  weiyigeek.top;  
  location / {  
      root   e:wwwroot;  
      index  index.html;  
  }  

  # 所有静态请求都由nginx处理,存放目录为html  
  location ~ .(gif|jpg|jpeg|png|bmp|swf|css|js)$ {  
      root    e:wwwroot;  
  }  

  # 所有动态请求都转发给tomcat处理  
  location ~ .(jsp|do)$ {  
      proxy_pass  http://test;  
  }  
  error_page   500 502 503 504  /50x.html;  
  location = /50x.html {  
      root   e:wwwroot;  
  }  
} 
复制成功

HTML以及图片和css以及js放到wwwroot目录下,而tomcat只负责处理jsp和请求,

例如当我们后缀为gif的时候,Nginx默认会从wwwroot获取到当前请求的动态图文件返回,当然这里的静态文件跟Nginx是同一台服务器,我们也可以在另外一台服务器,然后通过反向代理和负载均衡配置过去就好了,只要搞清楚了最基本的流程,很多配置就很简单了

5.6 请求转发案例

Nginx转发例子1 1.案例需求 短信服务器列表三台,提供服务的地址如下:http://192.168.88.21/22/23:8091/smsserver/services/sendSms?wsdl 彩信服务器列表三台,提供服务的地址如下:http://192.168.88.21/22/23:8092/msserver/services/sendMms?wsdl 假如Nginx安装在另一台单独机器上(公网IP为public_ip),对外提供服务地址如下: http://public_ip:8090/[smsserver | mmsserver]/services/sendSms?wsdl 短信发送服务 / 彩信发送服务

2.对于以上需求配置 /opt/nginx/web/conf/nginx.conf 如下:

代码块
Shell
自动换行
复制代码
#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; 
#设定请求缓冲, start 
client_header_buffer_size 1k; 
large_client_header_buffers 4 4k; 
#设定请求缓冲, end 

#设定提供服务的服务器,start 
#短信发送服务器 
upstream smsserver{ 
#weigth 表示权重,权值越大,分配几率越大 
#max_fails 当有max_fails个请求失败,就表示后端的服务器不可用,默认为1,将其设置为0可以关闭检查 
#fail_timeout 在以后的fail_timeout时间内nginx不会再把请求发往已检查出标记为不可用的服务器 
server 192.168.88.21:8091 weight=5 max_fails=5 fail_timeout=600s; 
server 192.168.88.22:8091 weight=5 max_fails=5 fail_timeout=600s; 
server 192.168.88.23:8091 weight=5 max_fails=5 fail_timeout=600s; 
} 
#彩信发送服务器 
upstream mmsserver{ 
#weigth 表示权重,权值越大,分配几率越大 
#max_fails 当有max_fails个请求失败,就表示后端的服务器不可用,默认为1,将其设置为0可以关闭检查 
#fail_timeout 在以后的fail_timeout时间内nginx不会再把请求发往已检查出标记为不可用的服务器 
server 192.168.88.21:8092 weight=5 max_fails=5 fail_timeout=600s; 
server 192.168.88.22:8092 weight=5 max_fails=5 fail_timeout=600s; 
server 192.168.88.23:8092 weight=5 max_fails=5 fail_timeout=600s; 
} 
#设定提供服务的服务器,end 

#gzip on; 

server { 
listen 8090; 
server_name weiyigeek.top; 
#设定请求转发规则, start 
#规则采用最长匹配,/smsserver/*优先匹配/smsserver,/mmsserver/*优先匹配/mmsserver,/aaaaaaaa/*因为没有任何匹配,最后匹配到/ 
#规则一 
location / { 
proxy_pass http://weiyigeek.top:80; 
} 
#规则二 
location /smsserver { 
proxy_pass http://smsserver; 
} 
#规则三 
location /mmsserver { 
proxy_pass http://mmsserver; 
} 
#设定请求转发规则, end 
error_page 500 502 503 504 /50x.html; 
location = /50x.html { 
root html; 
} 
} 

server { 
listen 80; 
server_name weiyigeek.top; 
#设定请求转发规则, start 
location / { 
#定义服务器的默认网站根目录位置 
root /home/work/statichtml/index.html; 
#定义首页索引文件的名称 
#index index.php index.html index.htm; 
#请求转向orderServer定义的服务器列表 
# proxy_pass http://server; 
#以下是一些反向代理的配置可删除. 
# 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; 
#nginx跟后端服务器连接超时时间(代理连接超时) 
# proxy_connect_timeout 90; 
#后端服务器数据回传时间(代理发送超时) 
# proxy_send_timeout 90; 
#连接成功后,后端服务器响应时间(代理接收超时) 
# proxy_read_timeout 90; 
#设置代理服务器(nginx)保存用户头信息的缓冲区大小 
# proxy_buffer_size 4k; 
#proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 
# proxy_buffers 4 32k; 
#高负荷下缓冲大小(proxy_buffers*2) 
# proxy_busy_buffers_size 64k; 
#设定缓存文件夹大小,大于这个值,将从upstream服务器传 
# proxy_temp_file_write_size 64k; 
} 
#设定请求转发规则, end 
error_page 500 502 503 504 /50x.html; 
location = /50x.html { root html; } 
   } 
} 
复制成功

Nginx转发例子2-改进例子

上面例子有个问题是直接将我整个web根目录smsserver和mmsserver暴露到公网了,其实我的目的只是想暴露两个接口地址,优化如下: 1.案例需求 API接口服务器列表两台,提供服务的地址如下: 接口一:http://192.168.88.21/22:8082/myweb/interface/getData 接口二:http://192.168.88.21/22:8082/myweb/interface/sendData Nginx安装在另外一台单独机器上(公网IP为public_ip),对外提供服务地址如下: http://public_ip:8081/myweb/interface/getData 接口一 http://public_ip:8081/myweb/interface/sendData 接口二

2.对于以上需求,配置/opt/nginx/web/conf/nginx.conf 如下:

代码块
Shell
自动换行
复制代码
#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; 
#设定请求缓冲, start 
client_header_buffer_size 1k; 
large_client_header_buffers 4 4k; 
#设定请求缓冲, end 

#设定提供服务的服务器,start 
#我的接口服务器,两台 
upstream myweb{ 
#weigth 表示权重,权值越大,分配几率越大 
#max_fails 当有max_fails个请求失败,就表示后端的服务器不可用,默认为1,将其设置为0可以关闭检查 
#fail_timeout 在以后的fail_timeout时间内nginx不会再把请求发往已检查出标记为不可用的服务器 
server 192.168.88.23:8082 weight=5 max_fails=5 fail_timeout=600s; 
server 192.168.88.24:8082 weight=5 max_fails=5 fail_timeout=600s; 
} 
#设定提供服务的服务器,end 

#gzip on; 

server { 
listen 80; 
server_name weiyigeek.top; 
#设定请求转发规则, start 
#规则采用最长匹配,即长度最长优先匹配,最后不匹配的走/进行匹配 
#规则一 
location / { 
root html; 
index index.html index.htm; 
} 
#设定请求转发规则, end 
error_page 500 502 503 504 /50x.html; 
location = /50x.html { 
root html; 
} 
} 

server { 
listen 8081; 
server_name weiyigeek.top; 
#设定请求转发规则, start 
#规则采用最长匹配,即长度最长优先匹配,最后不匹配的走/进行匹配 
#规则一 
location / { 
root html; 
index index.html index.htm; 
} 
#规则二,查询接口一 
location /myweb/interface/getData { 
proxy_pass http://myweb; 
#转发请求的原IP地址,程序中通过request.getHeader("Proxy-Client-IP")获得ip 
proxy_set_header Host $host; 
#如果是有涉及redirect的服务,一定要加上端口8081,否则默认tomcat在redirect时候默认找80端口 
#proxy_set_header Host $host:8081; 
proxy_set_header Proxy-Client-IP $remote_addr; 
} 
#规则三,查询接口二 
location /myweb/interface/sendData { 
proxy_pass http://myweb; 
#转发请求的原IP地址,程序中通过request.getHeader("Proxy-Client-IP")获得ip 
proxy_set_header Host $host; 
#如果是有涉及redirect的服务,一定要加上端口8081,否则默认tomcat在redirect时候默认找80端口 
#proxy_set_header Host $host:8081; 
proxy_set_header Proxy-Client-IP $remote_addr; 
} 
#设定请求转发规则, end 
error_page 500 502 503 504 /50x.html; 
location = /50x.html { 
root html; 
} 
} 
} 
复制成功

Nginx转发例子3-文件映射

修改/opt/nginx/nginx.conf/中第一行的运行用户改为

代码块
Shell
自动换行
复制代码
user root;
location /uploadfile {
    root /opt/staticdata/;
    access_log /opt/nginx/logs/upload_access.log;
    proxy_store_access user:rw group:rw all:rw;
}
复制成功

Nginx转发例子4-反向代理 Step1.通过apt安装得Nginx修改配置文件:

代码块
Shell
自动换行
复制代码
cd /etc/nginx/conf.d && vim www.google.com.hk.conf
复制成功

Step2.然后写入这样的配置文件:

代码块
Shell
自动换行
复制代码
proxy_cache_path /data/nginx/cache/one levels=1:2 keys_zone=one:10m max_size=10g;
proxy_cache_key "$host$request_uri";
#google 镜像站
upstream google {
 server 74.125.224.80:80 max_fails=3;
 server 74.125.224.81:80 max_fails=3;
 server 74.125.224.82:80 max_fails=3;
 server 74.125.224.83:80 max_fails=3;
 server 74.125.224.84:80 max_fails=3;  
}
server {
    listen 80;
    server_name www.example.com;
    access_log /var/log/nginx/a.access.log;
    error_log /var/log/nginx/a.error.log;
    root html;
    index index.html index.htm index.php;
    rewrite ^(.*) http://www.example.com$1 permanent;
    location / {
                    proxy_cache one;
                    proxy_cache_valid 200 302 1h;
                    proxy_cache_valid 404 1m;
                    proxy_redirect http://www.google.com.hk/ ;
                    proxy_cookie_domain google.com.hk www.example.com;
                    proxy_pass http://google;
                    proxy_set_header Host "www.google.com.hk";
                    proxy_set_header Accept-Encoding "";
                    proxy_set_header User-Agent $http_user_agent;
                    proxy_set_header Accept-Language "zh-CN";
                    proxy_set_header Cookie "NID=76=Len8rjrYIITd5At0fRh9v2eE4R4gPhQtYJ23gtZO70VZgTbmtr5HdM4AJw4j7UyG7cG9TI6w6ZpRp1zFhWjJASVc_yCDIEmvbkCrCdt8l-w0r7xGVgBc-IBaWGq5WRCT; expires=Sat, 20-Aug-2016 13:21:29 GMT;";             
                    sub_filter www.google.com.hk www.example.com;
                    sub_filter_once off;
    }
}

复制成功

参数解释

1.定义了个upstream google,放了5个谷歌的ip,而不是直接反代 www.google.com.hk ,是为了防止谷歌的验证码(谷歌为了防止恶意访问,在访问数量增加后会要求输入验证码), proxy_pass http://google; 反向代理到upstream google,会随机把请求分配到那几个ip。那几个ip可以在自己的vps或服务器上使用nslookup www.google.com获取。。

2.设置了反向代理缓存,某些资源不用重复去请求谷歌获取,加快搜索速度。

3.proxy_redirect https://www.google.com/ /; 这行的作用是把谷歌服务器返回的302响应头里的域名替换成我们的,不然浏览器还是会直接请求www.google.com , 那样反代就失效了。

4.proxy_cookie_domain google.com www.example.com; 把cookie的作用域替换成我们的域名。

5.proxy_set_header Accept-Encoding “”; 防止谷歌返回压缩的内容,因为压缩的内容我们无法作域名替换。

6.proxy_set_header Accept-Language “zh-CN”;设置语言为中文。

7.proxy_set_header Cookie “”; 这行很关键,传固定的cookie给谷歌,是为了禁止即时搜索,因为开启即时搜索无法替换内容。还有设置为新窗口打开网站,这个符合我们打开链接的习惯。

8.sub_filter www.google.com www.example.com; 是把谷歌的域名替换成自己的,注意需要安装nginx的sub_filter模块。

Step3.修改配置文件后重新启动 nginx,执行  service nginx start 命令即可

5.7 错误页面跳转设置

描述::我Linux服务器上已经在tomcat上部署了一个项目,使用Nginx进行的代理,访问项目不存在的页面时,出现的是Nginx默认的404页面,现在我配置我自己写的404页面进行提示.

  • 第一种配置方式:网络地址跳转

代码块
Shell
自动换行
复制代码
http {
    include       mime.types;
    default_type  application/octet-stream;
    #关键点
	proxy_intercept_errors on;
	... 以下省略;
    server {
        listen 80;
        server_name  www.xxxxxxx.com;
         location / {
            proxy_pass http://search-masteryee;
			proxy_set_header   REMOTE-HOST $remote_addr;
			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    20m; 
        }
        #关键点
        error_page  404  http://www.baidu.com;
    }
}
复制成功

  • 第二种配置方式:跳转本地地址 说明:我的404.html页面文件放在nginx安装目录下的html文件夹内;

代码块
Shell
自动换行
复制代码
http {
    proxy_intercept_errors on;
    server {
        listen 8080;
        #charset utf-8;
        ....
        #绝对地址
        error_page  404 /404.html;
        location = /404.html {
            #使用绝对地址跳转服务器/usr/local/nginx/html/404.html
            root  /usr/local/nginx/html;
        }
        
        #相对地址
        error_page 404 /404.html;
        location = /404.html {
            #使用相对地址跳转nginx安装目录下的html/404.html
            root   html;
            #下面这种多了一个/ 反而不起作用
            #root   /html;
        }

        #配置多种返回码的多个错误页面,也可以同时配置多个错误码跳转一个页面,可以同时存在 
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }
}
复制成功

  • 第三种情况配置方式:tomcat未启动时

代码块
Shell
自动换行
复制代码
http {
    proxy_intercept_errors on;
    fastcgi_intercept_errors on;
    server {
        listen 80;
        location / {
            proxy_pass http://search-masteryee;
			proxy_set_header REMOTE-HOST $remote_addr;
			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 20m; 
        }
        error_page   500 502 503 504  /404.html;
		error_page   404  /404.html;
        location = /404.html {
            root   html;
        }
    }
}
复制成功

  • 第四种情况:proxy_intercept_errors配置地址多样

代码块
Shell
自动换行
复制代码
http {
    fastcgi_intercept_errors on;
    server {
        listen 80;
        #可以放在http、server、location下面
        proxy_intercept_errors on;
        location / {
            proxy_pass http://search-masteryee;
        }
        error_page   500 502 503 504  /404.html;
		error_page   404  /404.html;
        location = /404.html {
            root   html;
        }
    }
}
复制成功

总结:

  • proxy_intercept_errors on:配置的错误页面表示的是当服务器返回的状态码为我们配置的状态码时才进行的页面跳转;

  • fastcgi_intercept_errors on:在代理的应用服务未启动错误时候进行错误页面的跳转;

5.8 阻止特定URL访问

描述:常常采用的两种方式就是然后采用正则进行匹配;

比如:  代表是域名后路径与参数即是。如果只访问www.baidu.com 这时候里也会有个/的。

基础示例:

代码块
Shell
自动换行
复制代码
#指定文件阻止访问
location ~ /\.ht {
    deny  all;
}

#指定参数阻止访问
location / {
    root   html;
    index  index.php;
    if ($request_uri ~* "/\?nsukey="){
        return 403 "I've recorded your ip Wait to check the water meter";
    }
}

location ~ \.php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        fastcgi_params;
    if ($request_uri ~* "/.+\.php\?nsukey="){
        return 403 "I've recorded your ip Wait to check the water meter";
    }
}
复制成功

6.附录

6.1 自启动脚本

代码块
Shell
自动换行
复制代码
#!/bin/sh
# nginx - this script starts and stops the nginx daemon
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /usr/local/nginx/conf/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx/nginx.pid
# pidfile:     /usr/local/nginx/logs/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
#需要根据实际情况更改
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
#需要根据实际情况更改
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
   # make required directories
   user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
   for opt in $options; do
       if [ `echo $opt | grep '.*-temp-path'` ]; then
           value=`echo $opt | cut -d "=" -f 2`
           if [ ! -d "$value" ]; then
               # echo "creating" $value
               mkdir -p $value && chown -R $user $value
           fi
       fi
   done
}
start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}
stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}
restart() {
    configtest || return $?
    stop
    sleep 1
    start
}
reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}
force_reload() {
    restart
}
configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
    status $prog
}
rh_status_q() {
    rh_status >/dev/null 2>&1
}
case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac
复制成功

6.2 学习思考

思考1:Nginx如何做到热部署? 描述:所谓热部署,就是配置文件nginx.conf修改后,不需要stop Nginx不需要中断请求,就能让配置文件生效 通过上文我们已经知道worker进程负责处理具体的请求,那么如果想达到热部署的效果,可以想象:

  • 方案一:修改配置文件nginx.conf后,主进程master负责推送给worker进程更新配置信息,worker进程收到信息后,更新进程内部的线程信息。

  • 方案二:修改配置文件nginx.conf后,重新生成新的worker进程,当然会以新的配置进行处理,而且新的请求都必须交给新的worker进程,至于老worker进程,等把那些以前的请求处理完毕kill掉即可。

思考2:Nginx如何做到高并发下的高效处理? 描述:上文已经提及Nginx的worker进程个数与CPU绑定、worker进程内部包含一个线程高效回环处理请求,这的确有助于效率,但这是不够的。

  • 多线程Socket IO技术:BIO/NIO/AIO、异步/同步、阻塞/非阻塞...要同时处理那么多的请求,要知道有的请求需要发生IO,可能需要很长时间,如果等着它就会拖慢worker的处理速度。 Nginx采用了Linux的epoll模型基于事件驱动机制,它可以监控多个事件是否准备完毕,如果OK那么放入epoll队列中这个过程是异步的。worker只需要从epoll队列循环处理即可。

思考3:Nginx挂了怎么办? 描述:Nginx既然作为入口网关,很重要,如果出现单点问题,显然是不可接受的。答案是:Keepalived+Nginx实现高可用。(可以参考另外一篇文章)

  • 第一: 请求不要直接打到Nginx上,应该先通过Keepalived(这就是所谓虚拟IP,VIP)

  • 第二: Keepalived应该能监控Nginx的生命状态(提供一个用户自定义的脚本,定期检查Nginx进程状态,进行权重变化,,从而实现Nginx故障切换)


原文地址:https://blog.weiyigeek.top/2019/9-1-121.html

本文至此完毕,更多技术文章,尽情期待下一章节!


已发布的相关历史文章(点击即可进入)

1.我在B站学运维之Nginx反代服务器基础介绍与入门实践​

我在B站学运维之如何让HTTPS站点评级达到A+? 还得看这篇HTTPS安全优化配置最佳实践​

我在B站学运维之如何让HTTPS站点更加安全?这篇HTTPS安全加固配置最佳实践指南就够了​


欢迎各位志同道合的朋友一起学习交流,如文章有误请在下方留下您宝贵的经验知识,个人邮箱地址【master#weiyigeek.top】或者 个人公众号【WeiyiGeek】联系我。


更多文章来源于【WeiyiGeek Blog - 为了能到远方,脚下的每一步都不能少】 个人博客。

个人主页: 【 https://weiyigeek.top 】

博客地址: 【 https://blog.weiyigeek.top 】

https://weiyigeek.top - Always keep a beginner's mind, don&#​39;t forget the beginner's mind

专栏书写不易,如果您觉得这个专栏还不错的,请给这篇专栏【点个赞、投个币、收个藏、关个注,转个发、留个言】,这将对我的肯定,谢谢!。

谢谢,各位帅哥、美女四连支持!!这就是我的动力!

 更多文章,请访问【个人博客 - https://blog.weiyigeek.top】站点,谢谢支持!