今天我们来学习下nginx常用的一些配置
1 镜像源:sudo rpm -Uvh http:// nginx.org/packages/ centos/7/ noarch/RPMS/ nginx-release-centos-7 -0 .el7.ngx.noarch.rpm
centos上安装这个镜像源,然后rpm install nginx即可
Nginx.conf配置文件解析 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 user www-data; worker_processes 1 ; error_log /var/log/error .log;pid /var/run/nginx.pid; events { use epoll ; worker_connections 1024 ; } http { include /etc/mime.types; default_type application/octet-stream; access_log /var/log/access.log; sendfile on ; keepalive_timeout 65 ; tcp_nodelay on ; gzip on ; gzip_disable "MSIE [1-6]\.(?!.*SV1)" ; client_header_buffer_size 1k ; large_client_header_buffers 4 4k ; include /etc/conf.d/*.conf ; include /etc/sites-enabled/*; upstream mysvr { server 192.168.8.1:3128 weight=5 ; server 192.168.8.2:80 weight=1 ; server 192.168.8.3:80 weight=6 ; } server { listen 80 ; server_name www.xx.com; access_log logs/www.xx.com.access.log main; location / { root /root; index index.php index.html index.htm; fastcgi_pass www.xx.com; fastcgi_param SCRIPT_FILENAME $document_root /$fastcgi_script_name ; include /etc/fastcgi_params; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /root; } location ~ ^/(images|javascript|js|css|flash|media|static)/ { root /var/www/virtual/htdocs; expires 30d ; } location ~ \.php$ { root /root; fastcgi_pass 127.0.0.1:9000 ; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name ; include fastcgi_params; } location /NginxStatus { stub_status on ; access_log on ; auth_basic "NginxStatus" ; auth_basic_user_file conf/htpasswd; } location ~ /\.ht { deny all; } } }
Nginx在dockerfile中的配置 Dockerfile中执行的方式,注意这里是将自己配置的nginx的配置文件拷贝到了/opt/nginx的目录下面
1 CMD[“nginx”,”-p”,”/opt/ nginx”.”-c”,”/opt/ conf/nginx.conf”]
Nginx在配置文件中的内置变量 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 # 通过arg_<name>的方式可取出相关参数,若请求 /foo?name=Tony&age=2,则 arg_name=tony arg_age=2 $ arg_name $ args # 客户端IP地址二进制 $ binary_remote_addr # 发送到客户端的字节数,不包括响应头 $ body_bytes_sent # 发送给客户端字节数 $ bytes_sent # 连接序列号 $ connection # 当前已经连接的请求书 $ connection_requests # Content-Length 请求头 $ content_length # Content-Type 请求头 $ content_type # cookie 名称 $ cookie_name # 当前请求的 root 或 alias 的值 $ document_root # 与 $uri 相同 $ document_uri # 优先级:请求行中的 host name,请求头中的 Host,请求匹配的 server name $ host # host name $ hostname # 任意请求头字段。变量名的最后一部分是转换为小写的字段名,用下划线替换破折号 $ http_name # 如果连接在 SSL 模式下运行,则为 on,否则为空字符串 $ https # ? 后如果请求行有参数,或者空字符串 $ is_args # 设置此变量可以限制响应速度 $ limit_rate # 当前时间(秒),分辨率为毫秒 $ msec # nginx 版本号 $ nginx_version # 当前 worker 进程号 $ pid # 如果是 pipelined 则为 p,否则为 . $ pipe # 代理协议头中的客户端地址,否则为空字符串,代理协议之前必须通过在listen指令中设置 proxy_protocol 参数来启用 $ proxy_protocol_addr # 来自代理协议头的客户端端口,否则为空字符串,代理协议之前必须通过在listen指令中设置 proxy_protocol 参数来启用 $ proxy_protocol_port # 与 $args 相同 $ query_string # 与当前请求的 root 或 alias 指令值对应的绝对路径名,所有符号链接都解析为实际路径 $ realpath_root # 客户端地址 $ remote_addr # 客户端端口 $ remote_port # 使用 Basic auth 的用户名 $ remote_user # 完整的请求行 $ request # 请求体,当将请求体读入内存缓冲区时,proxy_pass、fastcgi_pass、uwsgi_pass和scgi_pass指令处理的位置可以使用变量的值 $ request_body # 具有请求主体的临时文件的名称 $ request_body_file # 如果请求完成则为 OK,否则为空 $ request_completion # 当前请求的文件路径,基于 root 或 alias 和请求 URI $ request_filename # 由16个随机字节生成的惟一请求标识符,以十六进制表示 $ request_id # 请求长度(包括请求行、头和请求体) $ request_length # 请求方法,如 GET 或 POST $ request_method # 请求处理时间,从客户端读取第一个字节以来的时间 $ request_time # 若请求 /foo?a=1&b=2,则 request_uri=/foo?a=1&b=2 $ request_uri # 如 http 或 https $ scheme # 任意响应报头字段,变量名的最后一部分是转换为小写的字段名,用下划线替换破折号 $ sent_http_name # 响应结束时发送的任意字段,变量名的最后一部分是转换为小写的字段名,用下划线替换破折号 $ sent_trailer_name # 接受请求的服务器的地址 $ server_addr # 接受请求的 server 名称 $ server_name # 接受请求的 server 端口 $ server_port # 请求协议,如 HTTP/1.0 或 HTTP/1.1 或 HTTP/2.0 $ server_protocol # 响应状态 $ status $ tcpinfo_rtt,$tcpinfo_rttvar ,$tcpinfo_snd_cwnd ,$tcpinfo_rcv_space # 本地时间ISO 8601标准格式 $ time_iso8601 # 通用日志格式的本地时间 $ time_local # 若请求 /foo?a=1&b=2,则 uri=/foo $ uri # 用户代理 $ http_user_agent # cookie $ http_cookie
Nginx的访问鉴权(设置登录账号密码) 首先安装htpasswd和ngxin工具 用htpasswd的工具在/etc/创建一个用户密码,我这里创建一个admin用户,密码也是admin
1 2 3 4 $ htpasswd -c .htpasswd admin New password : admin Re-type new password : admin Adding password for user admin
在ngxin的配置文件中添加配置,加入你之前访问的端口是30003 1 2 3 4 5 6 7 8 9 http { server { listen 0.0.0.0:40003 ; location / { proxy_pass http://localhost:30003/; auth_basic "Prometheus" ; auth_basic_user_file ".htpasswd" ; } }
启动nginx采用如下地址访问你的30003服务 在浏览器输入http://nginx-ip:40003,提示你需要输入账号密码,输入之前的admin/admin则登录成功
也可以在后台进行curl -u admin http://localhost:40003进行测试访问
Nginx中proxy_pass的配置 1 2 3 4 5 6 7 8 9 location /test/ { Proxy_pass http:// t6:8300 ; } location /test/ { Proxy_pass http:// t6:8300 /; #带/ }
上面两种配置,区别只在于proxy_pass转发的路径后是否带 “/”
针对情况1,如果访问url = http://server/test/test.jsp,则被nginx代理后,请求路径会便问http://proxy_pass/test/test.jsp,将test/ 作为根路径,请求test/路径下的资源
针对情况2,如果访问url = http://server/test/test.jsp,则被nginx代理后,请求路径会变为 http://proxy_pass/test.jsp,直接访问server的根资源
Nginx的启停 启动 1 2 cd usr/local/sbin ./nginx
重启 更改配置重启nginx
kill -HUP 主进程号或进程号文件路径,或者使用
1 2 cd /usr/local/sbin ./nginx -s reload
判断配置文件是否正确
1 2 3 4 nginx -t -c /usr/ local/conf/ nginx.conf 或者 cd /usr/ local/sbin ./nginx -t
关闭 查询nginx主进程号
从容停止 kill -QUIT 主进程号 快速停止 kill -TERM 主进程号 强制停止 kill -9 nginx
若nginx.conf配置了pid文件路径,如果没有,则在logs目录下
1 kill -信号类型 '/usr/local/logs/nginx.pid'
Nginx如何读取环境变量 首先需要引入nginx的lua模块 具体安装lua模块参考下列dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 FROM centos:centos7 RUN yum -y update RUN yum -y install gcc gcc-c++ autoconf automake make RUN yum -y install zlib zlib-devel openssl* pcre* wget lua-devel MAINTAINER niewx 35715270 @qq.com ADD http:// nginx.org/download/ nginx-1.14 .0 .tar.gz /tmp/ ADD https://gi thub.com/LuaJIT/ LuaJIT/archive/ v2.0.5 .tar.gz /tmp/ ADD https://gi thub.com/simpl/ ngx_devel_kit/archive/ v0.3.0 .tar.gz /tmp/ ADD https://gi thub.com/openresty/ lua-nginx-module/archive/ v0.10.13 .tar.gz /tmp/ ADD http:// labs.frickle.com/files/ ngx_cache_purge-2.3 .tar.gz /tmp/ WORKDIR /tmp RUN tar zxf v2.0.5 .tar.gz WORKDIR /tmp/ LuaJIT-2.0 .5 RUN make PREFIX=/usr/ local/luajit RUN make install PREFIX=/usr/ local/luajit WORKDIR /tmp RUN tar -xzvf v0.3.0 .tar.gz RUN cp -r ngx_devel_kit-0.3 .0 / /u sr/local/ src/ RUN tar -xzvf v0.10.13 .tar.gz RUN cp -r lua-nginx-module-0.10 .13 / /u sr/local/ src/ RUN tar -xzvf ngx_cache_purge-2.3 .tar.gz RUN cp -r ngx_cache_purge-2.3 / /u sr/local/ src/ RUN export LUAJIT_LIB=/usr/ local/lib RUN export LUAJIT_INC=/usr/ local/include/ luajit-2.0 RUN mkdir -p {/usr/ local/logs,/ var/lock} RUN useradd -M -s /sbin/ nologin nginx RUN tar -zxvf nginx-1.14 .0 .tar.gz RUN mkdir -p /usr/ local/nginx RUN cd /tmp/ nginx-1.14 .0 \ && ./configure --prefix=/u sr/local/ nginx --user=nginx --group=nginx \ --error-log-path=/usr/ local/logs/ error.log \ --http-log-path=/usr/ local/logs/ access.log \ --pid-path=/usr/ local/logs/ nginx.pid \ --lock-path=/var/ lock/nginx.lock \ --with-ld-opt="-Wl,-rpath,/usr/local/luajit/lib" \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-http_sub_module \ --add-module=/usr/ local/src/ lua-nginx-module-0.10 .13 \ --add-module=/usr/ local/src/ ngx_devel_kit-0.3 .0 \ --add-module=/usr/ local/src/ ngx_cache_purge-2.3 \ && make && make install RUN /usr/ local/sbin/ nginx -c /usr/ local/conf/ nginx.conf RUN ln -s /usr/ local/sbin/ * /usr/ local/sbin/ EXPOSE 80 443 CMD ["/usr/local/sbin/nginx" ,"-g" ,"daemon off;" ]
在系统中写入你的环境变量 1 export TEST_IP =10.10.10.10
在nginx中引入你的环境变量,具体编写参考如下
Nginx监听多个端口 可以配置多个server,每个server配置不同的端口
Nginx的负载均衡 1 2 3 4 5 6 7 upstream test{ server 11.22 .333 .11 :6666 weight=1 ; server 11.22 .333 .22 :8888 down; server 11.22 .333 .33 :8888 backup; server 11.22 .333 .44 :5555 weight=2 ; }
down 表示单前的server临时不參与负载.
weight 默觉得1.weight越大,负载的权重就越大
backup: 其他全部的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻