nginx 常用用法

Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。我就介绍几个我在工作中用到的nginx的反向代理功能。

代理本地目录

这个需求是比如vue项目或者h5 要发布到服务器上,这时候就用到了nginx ,因为nginx处理静态资源非常的nice,我们就会代理一个目录。

server {
    listen     8002;
    server_name  localhost;
    root   /usr/local/path;
    location / {
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

如果是做图片代理访问也是可以的

server {
    listen       8088;
    server_name  127.0.0.1;
    location / {
        root   /home/image;
        autoindex on;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

注意

有些同学在使用linux服务器代理图片访问的时候可能出现了403这样的错误,解决方式有两种

  • 在nginx.conf 中加入 user root 即可
  • 授予访问目录755 权限

代理域名

有这样一个需求,a.fulinlin.com 要访问服务器里的项目A ,而b.fulinlin.com 要访问服务器里的项目B,这时候该怎么办呢,服务器只有一个80端口,此时呢可以用nginx解决

server {
    listen       80;
    server_name  a.fulinlin.com;
    location / {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://ip:端口/;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
server {
    listen       80;
    server_name  b.fulinlin.com;
    location / {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://ip:端口/;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

这样配置就能做到 访问 不用的域名或者二级域名跳转到不同的项目里。

代理路径

有这样一个需求,假设有一个域名www.fulinlin.com 想实现www.fulinlin.com/wikiwww.fulinlin.com/bolg 这样区分访问两个项目,怎么办到呢? 其实呢不难配置

server {
    listen       80;
    server_name  www.fulinlin.com;
    location /wiki {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://ip:端口/;
    }
    location /blog {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://ip:端口/;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

ssl证书代理

此时呢,项目经理想做道 https 套ssl证书访问网站,这时候怎么办呢?没关系nginx还能解决

server {
    listen       443 ssl;
    server_name  localhost;
    
    ssl_certificate      cert.pem;
    ssl_certificate_key  cert.key;
    
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;
    
    location / {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://ip:端口/;
    }
}

填写证书相应的 pem和key即可 。

但是呢领导还有需求 怎么办到访问http 的时候跳转到https呢 ? 那么nginx还能帮你解决 只用在80里加一行代码即可。

server {
   listen     80;
   server_name  localhost;
   rewrite ^(.*)$ https://${server_name}$1 permanent; 
}

动静分离

ngxin还有个强大的地方就是代理静态资源超快。以下配置的意思是 访问80 代理到 tomcat下,然后访问到 js|css|ico|png|jpg|eot|svg|ttf|woff 相应的文件后,会去/var/lib/project/static 下去访问,或者就是去另一个专门放静态资源的服务器去访问。

 server{
    listen 80;
    server_name localhost;
    location / {
        index index; 
         #指向tomcat 
        proxy_pass http://ip:端口;
    }
    location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) {
      	#简单点说我们弄了一台服务器放置静态资源,然后通过这个路径进行代理过去
        # proxy_pass http://ip:端口;
        #所有静态文件直接读取硬盘
        root /var/lib/project/static ;
        #缓存30天
        expires 30d;
    }
    #其他页面反向代理到tomcat容器
    location ~ .*$ {
        index index;
        proxy_pass http://ip:端口;
    }
}

限流

Nginx为我们提供了请求限制模块(ngx_http_limit_req_module)、基于令牌桶算法的流量限制模块(ngx_stream_limit_conn_module),可以方便的控制令牌速率,自定义调节限流,实现基本的限流控制。

请求限制的功能来自于 ngx_http_limit_req_module 模块。使用它需要首先在 http 配置段中定义限制的参照标准和状态缓存区大小。

  • limit_req_zone 只能配置在 http 范围内;

  • $binary_remote_addr 表示客户端请求的IP地址;

  • mylimit 自己定义的变量名;

  • rate 请求频率,每秒允许多少请求;

  • limit_reqlimit_req_zone 对应,burst 表示缓存住的请求数,也就是任务队列。

下面的配置就是定义了使用客户端的 IP 作为参照依据,并使用一个 10M 大小的状态缓存区。结尾的 rate=1r/s 表示针对每个 IP 的请求每秒只接受一次。

10M 的状态缓存空间够不够用呢?官方给出的答案是 1M 的缓存空间可以在 32 位的系统中服务 3.2 万 IP 地址,在 64 位的系统中可以服务 1.6 万 IP 地址,所以需要自己看情况调整。如果状态缓存耗光,后面所有的请求都会收到 503(Service Temporarily Unavailable) 错误。

# 定义了一个 mylimit 缓冲区(容器),请求频率为每秒 1 个请求(nr/s)
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
server {
	listen	80;
	location / {
		# nodelay 不延迟处理
        # burst 是配置超额处理,可简单理解为队列机制
        # 上面配置同一个 IP 没秒只能发送一次请求(1r/s),这里配置了缓存3个请求,就意味着同一秒内只能允许 4 个任务响应成功,其它任务请求则失败(503错误)
		limit_req zone=mylimit burst=3 nodelay;
		proxy_pass http://localhost:7070;
	}
}

负载均衡

假设有这样一个需求,服务A要做集群, 这时候假设有 192.168.8.100:8080192.168.8.101:8080 这两个服务,要做负载怎么办呢?nginx可以做到

http {
    upstream linuxidc { 
        server 192.168.8.100:8080; 
        server 192.168.8.101:8080; 
	}
    server {
   		listen     80;
   		server_name  localhost;
   		location / { 
            root  html; 
            index  index.html index.htm; 
            proxy_pass http://linuxidc; 
		} 
	}
}

这样呢负载均衡就设置完毕了,但是是轮训的,有没有什么更好的负载放生呢?

weight(权重)

指定轮询几率,weight和訪问比率成正比,用于后端服务器性能不均的情况。例如以下所看到的。192.168.8.101的訪问比率要比192.168.8.100的访问比率高一倍。

upstream linuxidc{ 
    server 192.168.8.100:8080; 
    server 192.168.8.101:8080; 
}

ip_hash(访问ip)

​ 每一个请求按訪问ip的hash结果分配。这样每一个訪客固定訪问一个后端服务器,能够解决session的问题。

upstream favresin{ 
    ip_hash; 
    server 192.168.8.100:8080; 
    server 192.168.8.101:8080; 
}

fair(第三方)

需要安装模块, 按后端服务器的响应时间来分配请求。响应时间短的优先分配。

upstream favresin{      
    server 192.168.8.100:8080; 
    server 192.168.8.101:8080; 
    fair; 
}

url_hash(第三方)

按访问url的hash结果来分配请求,使每一个url定向到同一个后端服务器。后端服务器为缓存时比较有效。

注意:在upstream中加入hash语句。server语句中不能写入weight等其他的參数,hash_method是使用的hash算法。

upstream resinserver{ 
     server 192.168.8.100:8080; 
     server 192.168.8.101:8080; 
     hash $request_uri; 
     hash_method crc32; 
}

细节配置

upstream还能够为每一个设备设置状态值,这些状态值的含义分别例如以下:

  • down 表示单前的server临时不參与负载.

  • weight 默觉得1.weight越大,负载的权重就越大。

  • max_fails :同意请求失败的次数默觉得1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误.

  • fail_timeout : max_fails次失败后。暂停的时间。

  • backup: 其他全部的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

upstream bakend{ 
      #定义负载均衡设备的Ip及设备状态 
      ip_hash; 
      server 192.168.8.100:8080 down; 
      server 192.168.8.101:8080 weight=2; 
      server 192.168.8.102:8080; 
      server 192.168.8.103:8080 backup; 
}

怎么安装模块

上面说到好多什么第三方 模块啥的 ,那么到底怎么安装第三方模块呢?

去github 寻找响应的模块安装包然后来 就可以安装了。以fair为栗子。

未安装的nginx

配置:

./configure --prefix=/usr/local/nginx  --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf  --pid-path=/usr/local/nginx/nginx.pid  --add-module=/home/nginx-upstream-fair-master

编译安装

make && make intstall

安装过Nginx

切换到nginx目录执行一下操作

配置

./configure --prefix=/usr/local/nginx  --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid  --add-module=/home/nginx-upstream-fair-master

编译

make

复制nginx

 cp objs/nginx /usr/local/nginx/nginx

注意事项

已安装nginx,配置第三方模块时,只需要--add-module=/第三方模块目录,然后make编译一下就可以,不要 make install安装。编译后复制objs下面的nginx到指定目录下。

这知识介绍了我学习中常用的一点点配置,其实还有很多非常复杂的配置实现更复杂的功能,哈哈但是我不会,慢慢学习补充吧 0.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值