ngnix之笔记

流过昼夜 提交于 2019-12-02 04:51:27

#############################################################################

我们在使用的时候会遇到很多的恶意IP攻击,这个时候就要用到Nginx 禁止IP访问了。下面我们就先看看Nginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了你的ip)的时 候生效最关键的一点是,在server的设置里面添加这一行:
listen 80 default;
后面的default参数表示这个是默认虚拟主机。
Nginx 禁止IP访问这个设置非常有用。
比如别人通过ip或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回500.目前国内很多机房都要求网站主关闭空主机头,防止未备案的域名指向过来造成麻烦。就可以这样设置:
server {
listen 80 default;
return 500;
}
也可以把这些流量收集起来,导入到自己的网站,只要做以下跳转设置就可以:
server {
listen 80 default;
rewrite ^(.*) http://www.example.com permanent;
}
按照如上设置后,确实不能通过IP访问服务器了,但是在应该用中出现当server_name后跟多个域名时,其中一个域名怎么都无法访问,设置如下:
server {
listen 80;
server_name www.example.com example.com
}
没更改之前,通过server_name 中的www.example.com example.com均可访问服务器,加入Nginx 禁止IP访问的设置后,通过example.com无法访问服务器了,www.example.com可以访问,用 Nginx -t 检测配置文件会提示warning:
[warn]: conflicting server name “example.com” on 0.0.0.0:80,
ignored
the configuration file /usr/local/Nginx/conf/
Nginx.conf syntax is ok
configuration file /usr/local/Nginx/conf/Nginx.
conf test is successful
最后通过在listen 80 default;后再加server_name _;解决,形式如下:

#禁止IP访问
server {
listen 80 default;
server_name _;
server_name www.example.com example.com
return 500;
}
这样,通过example.com就能访问服务器了。

#########################################################################################

nginx 的proxy_intercept_errors 和error_page的搭配使用,

 

proxy_intercept_errors 

 

当上游服务器响应头回来后,可以根据响应状态码的值进行拦截错误处理,与error_page 指令相互结合。用在访问上游服务器出现错误,由nginx直接返回自定义的错误页面

location /houtai {
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_pass http://localhost:8080/houtai;
proxy_intercept_errors on;
}

error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;

location = /404.html {
root /usr/share/nginx/html;
internal;
}

location = /50x.html {
root /usr/share/nginx/html;
internal;

 

参考页面:https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-to-use-custom-error-pages-on-ubuntu-14-04

                  http://blog.csdn.net/hellolingyun/article/details/37934815

#######################################################################

对于有些服务端接口返回是固定值的json,可通过配置nginx直接返回json,减少程序的加载对资源的占用,减少接口响应时间
通过return,指定页面返回的内容
 location ~* (request/update)$ {
     default_type application/json;
     return 200 '{"update":"no"}';
 }
记得加default_type application/json ,不然浏览器打开时,是个文件。

 

#########################################################################

nginx 代理https后,应用redirect https变成http

原因分析:

 

浏览器到nginx是https,nginx到应用服务器变成http,

 

应用服务器,再做302 redirect的时候,返回的redirect 地址就好变成http的地址;

 

原因是spring mvc的servlet的secheme取值,request.getScheme()

 

是取请求里的一个scheme值,所有这个值在nginx代理时要设置成https

 

其中: request.getScheme() return http but not https.

 

解决方法:

目前是

proxy_redirect http:// $scheme://;

 

The same server needs to serve both HTTP and HTTPS, however, when the upstream issues a redirect (for instance, after a form is processed), all HTTPS requests are redirected to HTTP. The only thing I have found that will correct this issue is changing proxy_redirect to the following:

 

proxy_redirect http:// https://;

 

That works wonderfully for requests coming from HTTPS, but if a redirect is issued over HTTP it also redirects that to HTTPS, which is a problem.

 

Out of desperation, I tried:

 

if ($scheme = 'https') {
    proxy_redirect http:// https://;
}

########################################################################

网站它可能不希望被网络爬虫抓取,例如测试环境不希望被抓取,以免对用户造成误导,那么需要在该网站中申明,本站不希望被抓取。有如下方法:

 

server { 

 

listen 80; 

 

server_name 127.0.0.1; 

 

#添加如下内容即可防止爬虫

 

if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot") 

return 403; 

 

#########################################################################

Nginx设置HTTP认证:

1、安装htpassword来创建和生成加密的用户用于基础认证(Basic Authentication)
    sudo apt-get install apache2-utils

2、在Nginx托管的网站目录下生成一个.htpasswd文件。如下的命令可以创建文件同步增加用户和加密的密码到文件中

     sudo htpasswd -c /etc/nginx/.htpasswd exampleuser
3、网站的Nginx配置文件增加如下两行:
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!