### **1. IP限制**
> http_access_module
允許訪問
```
Syntax: allow address | CIDR | unix: | all;
Default:—
Context: http, server, location, limit_except
```
禁止訪問
```
Syntax: deny address | CIDR | unix: | all;
Default:—
Context: http, server, location, limit_except
```
使用案例:
~~~
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
#從上到下的順序,類似iptables。匹配到了便跳出。如上的例子先禁止了192.16.1.1,接下來允許了3個網段,其中包含了一個ipv6,最后未匹配的IP全部禁止訪問.被deny的將返回403狀態碼。
}
~~~
Nginx基于access_module有局限性
原理:基于客戶端的IP,但是對于Nginx來說,它不會管你哪個是真正的客戶端,如果我們的訪問不是客戶端與服務端直接連接,而是通過了一層代理,比如它的代理可以負載均衡、CDN的這種代理實現,也就是我們的訪問不是客戶端直接訪問的服務端,而是通過其他的中間件訪問服務端,這時候會出現一個問題,因為Nginx的access_module它是基于remote_addr這個變量來識別客戶端的IP的,那么如果一個ip通過中間件訪問服務端,那么Nginx認為訪問的ip就是中間件的IP,那么我們在基于IP做限制的時候,那么其實是沒有作用的。所以這樣的話,準確性是不高的,所以就是利用nginx的access_module有局限性。
解決方法:
①:采用別的http頭信息訪問控制,如HTTP_X_FORWARDED_FOR。

但是http\_x\_forwarded\_for進行訪問控制會存在問題,因為是一個協議要求的,并不是所有的cdn和代理廠商它會按照要求來做,甚至x\_forwarded\_for存在被修改的可能,因為只是一個頭信息,所以最終還是不真實。
http_x_forwardded_for也是Nginx的http頭變量的一個常用的變量,它和remote_addr是有區別的。不同的是,x_forwarded_for是http協議中規定頭中要攜帶的,所以在客戶端訪問中間件,再訪問服務端的時候,那么服務端通過Nginx會記錄真實IP和中間件的IP。
格式:http_x_forwarded_for = 客戶端ip,第一臺代理ip,第二臺代理ip,第N臺代理ip....,所以http_x_forwarded_for是由一連串以逗號分隔的ip組成的。
②:結合geo模塊
③:通過HTTP自定義變量傳遞
因為nginx有自己的變量,我們可以在http頭信息定義一個我們規定的http變量在所有上一級的設備手動把remote\_addr的ip一級一級的攜帶過去,既能避免x_forwarded_for被修改,也能讀到客戶端的真實ip
*****
### **2. 用戶登錄限制**
> http_auth_basic_module
```
Syntax: auth_basic_user_file file;
Default: —
Context: http, server, location, limit_except
```
配置:
1.安裝插件:yum -y install httpd-tools
2.查看htpasswd插件:rpm -qf /usr/bin/htpasswd
3.生成一個身份文件(用于訪問站點時登錄)
①cd /etc/nginx
②htpasswd -c ./auth_conf/hao_admin (auth_conf :保存用戶身份信息的文件;hao_admin:用戶名)
③修改配置文件(示例:ip/admin.html)
```
location ~ ^/admin.html {
????????root /data/www;
????????auth_basic "auth:";?//開啟身份校驗
????????auth_basic_user_file /etc/nginx/auth_conf;?//身份校驗文件路徑
????????index index.html;
????}
```
訪問效果(瀏覽器)

局限性
需要提前設置密碼文件 、管理麻煩效率低下
解決方案:
① 通過lua文件實現
②nginx和LDAP打通,利用nginx_auth_ladap實現