工作中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