nginx从入门到实战(一)
程序员文章站
2022-03-19 23:45:55
...
nginx从入门到实战(一)
最权威的文档和教程:nginx.org
-
rpm -ql nginx
-
worker_processes工作进程数一般设置为cpu数量。也可以设置为auto
-
worker_connections可以优化,可以设置为1万多个。
-
limit_req_zone同一IP限制请求频率。
http { limit_conn_zone $binary_remote_addr zone=conn_zone:1m; #binary比string节省空间。同IP限速1秒一个request。 limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s; } location / { #limit_conn conn_zone 1; #burst为缓冲队列,每秒清除rate个请求.每秒最大可处理rate+burst个请求 limit_req zone=req_zone burst=3 nodelay; limit_req zone=req_zone burst=3; #limit_req zone=req_zone; } http { map $http_x_forwarded_for $clientRealIp { "" $remote_addr; ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr; } } 我们通过map自定义了一个变量$clientRealIp; 如果X-Forwarded-For头是空的,那么客户端真实IP就是remote_addr; 如果X-Forwarded-For头非空,我们就通过正则匹配,捕获到第一段,这就是用户的真实IP; 必须注意的是,在每一层代理都要设置X-Forwarded-For头。
-
http_access_module
location ~ ^/admin.html { root /opt/app/code; #allow 222.128.189.0/24; deny 192.168.32.8; allow all; index index.html index.htm; }
-
静态资源
#sendfile开启,提高网络包的传输效率,适合大文件传输 tcp_nopush on #keepalive连接下,提高传输实时性 tcp_nodelay on gzip on gzip_comp_level 2
-
跨域访问
location ~ .*\.(htm|html)$ { #允许abc站点跨域,或设置为*,允许所有站点跨域。 add_header Access-Control-Allow-Origin http://www.abc.com; add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS; #expires 24h; root /opt/app/code; }
-
防盗链
location ~ .*\.(jpg|gif|png)$ { #none:允许没有referer头信息的访问 #blocked:允许不是http协议的请求访问 #允许特定ip访问 # valid_referers none blocked 134.1.12.4 jeson.imoocc.com ~wei\.png; if ($invalid_referer) { return 403; } root /opt/app/code/images; }
测试
#返回403 curl -e "http://www.baidu.com" -I http://localhost/wei.png #返回200,没有referer头 curl -I http://localhost/wei.png #返回403 curl -e "http://128.147.3.2" -I http://localhost/wei.png #返回200 curl -e "http://134.1.12.4" -I http://localhost/wei.png #返回200,https协议也属于http curl -e "http://jeson.imoocc.com" -I http://localhost/wei.png #返回200,虽然域名非法,但协议不是http或https curl -e "ftp://abn.isfc.com" -I http://localhost/wei.png #返回200,正则匹配了wei.png curl -e "http://abc.com/wei.png/alsjfls" -I http://localhost/wei.png
-
反向代理
location ~ /test_proxy.html$ { proxy_pass http://127.0.0.1:8080; proxy_redirect default; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_connect_timeout 30; proxy_send_timeout 60; proxy_read_timeout 60; proxy_buffer_size 32k; proxy_buffering on; proxy_buffers 4 128k; proxy_busy_buffers_size 256k; proxy_max_temp_file_size 256k; }
测试
先用防火墙关闭8080端口,禁止外网直接访问8080. firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --zone= public --remove-port=8080/tcp --permanent firewall-cmd --reload
-
负载均衡
#简单轮询 http { upstream imooc { #url_hash调度 hash $request_uri #ip_hash; server 127.0.0.1:8001; server 127.0.0.1:8002; server 127.0.0.1:8003; } } server { listen 80; server_name localhost; #charset koi8-r; access_log /var/log/nginx/test_proxy.access.log main; resolver 8.8.8.8; location / { proxy_pass http://imooc; include proxy_params; } }
upstream imooc { #down:暂时不参与负载均衡,max_conns:限制最大的接收的连接数 server 127.0.0.1:8001 down; server 127.0.0.1:8002 backup; server 127.0.0.1:8003 max_fails=1 fail_timeout=10s; }
#清除规则 iptables -F #禁用8003端口 iptables -I INPUT -p tcp --dport 8003 -j DROP
-
缓存
#60分钟无访问的缓存将被清除 proxy_cache_path /opt/app/cache levels=1:2 keys_zone=imooc_cache:10m max_size=10g inactive=60m use_temp_path=off; if ($request_uri ~ ^/(url3|login|register|password\/reset)) { set $cookie_nocache 1; } location / { proxy_cache imooc_cache; #proxy_cache off; proxy_pass http://imooc; proxy_cache_valid 200 304 12h; proxy_cache_valid any 10m; proxy_cache_key $host$uri$is_args$args; #特定url不缓存 proxy_no_cache $cookie_nocache $arg_nocache; add_header Nginx-Cache "$upstream_cache_status"; #当一台服务器出现错误,超时,500等状态码时,跳到下一台服务器请求 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; include proxy_params; }