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/wiki
和 www.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_req
与limit_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:8080
和 192.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