Nginx部署及参数配置

一、一个简单的demo

worker_processes  1;  # 设置多少个进程,与cup核保持一致最好
events {
    worker_connections  1024; # 每个进程允许的最大连接数
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server
    {
        listen  8080;
        server_name  localhost;
        location / {
            root    D:/STUDY;   # 当输入[server_name]:[listen] 时会进入这个目录
            index   a.html;  # 默认界面
        }
        error_page 404 /error.html; #根据错误码跳转到error 界面
    }
} 

当在浏览器中输入[server_name]:[listen] (也就是localhost:8080)时,会在location 下的root对应的文件夹中找index 对应的界面(也就是a.html);

每次修改完conf 文件,可以用以下指令校验conf 配置是否合法

nginx -t -c "/etc/nginx/nginx.conf"   #校验文件合法

location的配置规则:

语法规则: location [=||*|^~] /uri/ { … }

  • = 开头表示精确匹配
  • ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
  • ~ 开头表示区分大小写的正则匹配
  • ~* 开头表示不区分大小写的正则匹配
  • !和!*分别为区分大小写不匹配及不区分大小写不匹配 的正则
  • / 通用匹配,任何请求都会匹配到。
  • 多个location配置的情况下匹配顺序为
    首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求

二、 Nginx 日志

在nginx 中使用日志,可以添加以下代码:
Nginx部署及参数配置_第1张图片
主要说一下log_format (日志的格式化):

'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'

log_fomat 为日志输出格式
remote_addr: 客户端地址
remote_user:认证的用户名,没有开启不会显示
time_local : nginx 服务器时间
request : request头的请求行(里面包含服务器的地址后半部分)
status : 状态码
body_bytes_sent : 服务端响应给客户端的body信息大小
http_referer : 上一级url 的地址
http_user_agent: 客户端使用代理(比如使用什么访问的)
http_x_forwarded_for : 每一级请求所携带的http 信息

下面为一段输出的日志,可以跟上述的format 对比一下

127.0.0.1 - - [30/Dec/2018:14:02:03 +0800] "GET /aa HTTP/1.1" 404 51 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-"
127.0.0.1 - - [30/Dec/2018:14:11:31 +0800] "GET /aa HTTP/1.1" 404 51 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-"

三、Nginx Modules (模块)

当我们输入nginx -V 时,会输出很多参数, 这些参数中就有很多以with-******_module格式的参数, 这些参数为nginx 的功能模块,我们说一下基础的模块:

1、 --with-http_stub_status_module (查看nginx 客户端连接状态)

配置语法

Syntax:	stub_status;
Default:	—
Context:	server, location

配置方式

location /mystatus{
   stub_status;
}

浏览器请求
Nginx部署及参数配置_第2张图片
当前活跃的连接数
接受 处理 总连接
读 写 等待

2、 --with-http_random_index_module (随机选择一个文件做主页)

语法:

Syntax:	index file ...;
Default:	
index index.html;
Context:	http, server, location

Nginx部署及参数配置_第3张图片
会在指定目录下随机选择主页

3、 --with-http_sub_module (http内容替换)
语法:

Syntax:	sub_filter string replacement;
Default:	—
Context:	http, server, location

demo:

location / {
    sub_filter '
sub_filter 'other' 'haochen';  #只替换一个字符
# 如果替换多个字符,就添加一段代码
sub_filter_once off  #关闭扣替换所有字符

4、 连接限制和请求限制

语法

Syntax:	limit_conn_zone key zone=name:size;
Default:	—
Context:	http

Syntax:	limit_conn zone number;
Default:	—
Context:	http, server, location
Syntax:	limit_req_zone key zone=name:size rate=rate [sync];
Default:	—
Context:	http

Syntax:	limit_req zone=name [burst=number] [nodelay | delay=number];
Default:	—
Context:	http, server, location

限制请求的条数:

limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;
#location 下
limit_req zone=req_zone burst=3 nodelay;

上述表示 每秒执行一条请求, 三条作为缓存,其他的限制执行

连接限制:

limit_conn_zone $binary_remote_addr zone=conn_zone:1m
#location 、server
limit_conn conn_zone 1;

上述表示一个同一时刻只能有一个连接过来

压力测试工具安装:

yum install httpd-tool  
ab -n 20 -c 20 www.baidu.com  // 请求总数20  并发20

更多介绍查看官网文档 http://nginx.org/en/docs/

5、访问控制

配置语法:

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

demo

location / {
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all;
}

6、 http_auth_basic_module(用户登录认证)

对客户端的请求进行登录验证

配置语法:

Syntax:	auth_basic string | off;
Default:	
auth_basic off;
Context:	http, server, location, limit_except

Syntax:	auth_basic_user_file file;
Default:	—
Context:	http, server, location, limit_except

首先要生成一个保存用户名和密码的配置文件,可以使用htpassword 加密:

  htpasswd -c auth.conf panlei

nginx.conf 中配置

location / {
    auth_basic           "closed site";
    auth_basic_user_file conf/auth.conf;
}

访问效果
Nginx部署及参数配置_第4张图片

四、各种使用场景

1、 静态资源

    语法: tcp_nopush on | off;
    默认值: tcp_nopush off;
    上下文: http, server, location

选项仅在使用sendfile的时候才开启
结果就是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。


    语法: tcp_nodelay on | off;
    默认值:  tcp_nodelay on;
    上下文: http, server, location

提高网络的实时性


语法:	gzip on | off;
默认值:	gzip off;
上下文:	http, server, location, if in location

压缩运输

各项参数
gzip_comp_level 1;  # 压缩比例
gzip_http_version 1.1  #压缩版本
gzip_types text/html  #文件格式

2、 代理

语法:	proxy_pass URL;
Default:	—
上下文:	location, if in location, limit_except

一个简单的demo:

server {
    listen       80;
    server_name  192.168.136.130;
    location ~ /login$ {
       proxy_pass http://192.168.1.116:8081;
    }
}

访问130/login 会被转发到116:8081/login

使用代理经常用的属性:

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;


如果只让特定ip 访问:

# 仅允许116.62.103.228 访问
 location / {
     if ( $http_x_forwarded_for !~* "^116\.62\.103\.228") {
         return 403;
     }
     root   /opt/app/code;
     index  index.html index.htm;
 }

3、负载均衡

语法: upstream name {} ,多配制在http 层。

demo:

    upstream pl{
        server 192.168.1.251:8080 down;
        server 192.168.1.252:8080 backup;
        server 192.168.1.253:8080 max_fails=1 fail_timeout=10s;
    }
server {
    listen       80;
    server_name  192.168.1.254;
    location / {
        proxy_pass http://pl;
    }
}

其中每个后缀的的作用:

后缀 描述
down 当前server 不参与负载均衡
backup 备份服务器
max_fails 最大失败数
fail_timeout 经过max_fails后服务暂停的时间
max_conns 最大连接数

nginx 负载均衡默认是轮询的规则,
nginx 还有以下的轮询策略:

调度策略 描述
加权轮询 根据weight值越大,分配的访问几率越高
ip_hash 每个请求根据IP的hash 分配,这样来自同一IP的可分配到同一服务器
url_hash 按照访问的url 的hash分配
least_conn 最少链接数,哪个服务器链接数少,就分配到哪个服务器
hash关键数值 hash自定义值

ip_hash 配置时,只需要在upstream 中添加关键字 ip_hash 就可以
hash 配置同上, 例如 hash $request_uri

你可能感兴趣的:(java,SpringCloud)