NGINX是一个免费的,开源的,高性能的HTTP服务器和反向代理,以及IMAP / POP3代理服务器。NGINX以其高性能,稳定性,丰富的功能集,简单的配置和低资源消耗而闻名。php
NGINX是用于Web服务,反向代理,缓存,负载平衡,媒体流等的开源软件。它最初是一个旨在实现最高性能和稳定性的Web服务器。除了HTTP服务器功能外,NGINX还能够用做电子邮件(IMAP,POP3和SMTP)的代理服务器以及HTTP,TCP和UDP服务器的反向代理和负载平衡器。css
yum install yum-utilshtml
vim /etc/yum.repos.d/nginx.repo [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key
yum install nginx
nginx
wget http://nginx.org/download/nginx-1.9.4.tar.gz tar -xzf nginx-1.9.4.tar.gz cd nginx-1.9.4
yum update yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
添加用户和组 web
groupadd www useradd -g www www 配置 ./configure \ --user=www \ --group=www \ --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-http_stub_status_module \ --with-http_realip_module \ --with-threads 编译 make 安装 make install
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
正则表达式
nginx/sbin/nginx
算法
nginx由模块组成,这些模块由配置文件中指定的指令控制。指令分为简单指令和块指令。一个简单的指令由名称和参数组成,用空格分隔,以分号(;)结尾。块指令与简单指令具备相同的结构,但它不是以分号结尾,而是以大括号({和})包围的一组附加指令结束。若是块指令在大括号内能够有其余指令,则称为上下文(示例: events, http, server和 location)。
http块包含处理Web流量的指令。这些指令一般被称为通用指令,由于它们被传递给NGINX服务的全部网站配置。http中能够配置多个server,一个server中能够配置多个location,除了http块、server块和location块以外,还有events块、stream块等
块指令和简单指令是有必定的对应关系的,好比,有些简单指令只能在http块中配置,有些简单指令只能在server块中配置,有些简单指令只能在location块中配置,有些简单指令既能在server块中配置又能在http块中配置,能够在官网中(http://nginx.org/en/docs/)查看指令存在的位置,而最上方不属于任何块的配置指令的区域属于主配置区,用于定义网站的全局配置 vim
user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; events { ... } http { ... server { ... location ... { ... ... } } server { ... } }
Nginx是以事件的触发来驱动的web服务器,Nginx服务器响应和处理Web请求的过程,就是基于事件驱动模型的,事件驱动模型包括事件收集器,事件发送器,事件处理器,事件收集器负责收集全部事件,事件包括来自软件、硬件以及用户的,事件发送器负责将收集器收集到的事件发送到目标对象,事件处理器负责具体事件的响应,事件包括读事件,写事件以及异常事件。centos
为三类事件分别建立一个事件描述符集合,分别用来收集读事件的描述符、写事件的描述符和异常事件的描述符,调用底层select()函数,等待事件发生。而后遍历三个集合中的事件描述符,当检测到事件发生时就处理该事件,select受最大文件描述符的限制数组
为三类事件建立一个集合,最后轮询的时候,能够同时检查这三种事件是否发生
把描述符列表的管理交给内核负责,一旦有某种事件发生,内核把发生事件的描述符列表通知给进程,这样就避免了轮询整个描述符列表。epoll库经过相关调用通知内核建立一个待处理的事件列表,当某一事件发生后,内核将发生事件的描述符列表上报给epoll库,获得事件列表的epoll库,就能够进行事件处理了。
nginx访问认证须要用到auth_basic模块,此模块使用的是HTTP Basic Authentication协议来对用户进行访问控制,但此模块并不保证安全性,由于浏览器是以明文方式将用户名和密码传给Web服务器的
语法 | auth_basic string 丨 off; |
---|---|
默认 | auth_basic off; |
应用位置 | http,server,location,limit_except |
string字符会在用户认证的弹窗中显示
语法 | auth_basic_user_file file; |
---|---|
默认 | - |
应用位置 | http,server,location,limit_except |
指定保存用户名和密码的文件
htpasswd [-cimBdpsDv] [-C cost] passwordfile username htpasswd -b[cmBdpsDv] [-C cost] passwordfile username password htpasswd -n[imBdps] [-C cost] username htpasswd -nb[mBdps] [-C cost] username password
-c 建立密码文件 -n 将加密后的内容输出在屏幕上; -m 默认采用MD5算法对密码进行加密 -d 采用CRYPT算法对密码进行加密 -p 不对密码文件中的密码进行加密,即便用普通文本格式的密码 -s 采用SHA算法对密码进行加密 -b 命令行中一并输入用户名和密码而不是根据提示输入密码,能够看见明文,不须要交互 -D 从密码文件中删除指定的用户
下面咱们经过auth认证来对kibana进行用户登陆认证
location /kibana/ { auth_basic "kibana"; auth_basic_user_file /etc/nginx/kibanauser; proxy_pass http://127.0.0.1:5601/; proxy_set_header Host $host:5601; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; rewrite ^/kibana/(.*)$ /$1 break; }
htpasswd -c /etc/nginx/kibanauser admin
vim /etc/nginx/nginx.conf server { listen 80 default_server; server_name huazai.com; location / { root html/huazai; index index.html; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } server { listen 80; server_name wanger.com; location / { root html/wanger; index index.html; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
cd /usr/share/nginx/html/ mkdir wanger mkdir huazai echo "I'm huazai" >huazai/index.html echo "I'm wanger" >wanger/index.html chmod -R 777 wanger/ chmod -R 777 huazai/ nginx -s reload
curl -xlocalhost:80 huazai.com I'm huazai curl -xlocalhost:80 wanger.com I'm wanger
server { listen 80 default_server; server_name huazai.com; location / { root html/huazai; index index.html; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } server { listen 800; server_name huazai.com; location / { root html/wanger; index index.html; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
nginx -t systemctl restart nginx
[root@ html]# curl 127.0.0.1:80 I'm huazai [root@ html]# curl 127.0.0.1:800 I'm wanger
location指令的做用是根据用户请求的URI来执行不一样的应用。
location [=|~|~*|^~|@] uri { …… }
uri能够是普通的字符串地址,也能够是正则表达式,其中 ~ 和 ~ 用于正则表达式, 其余前缀和无任何前缀都用于普通字符,而~是区分大小写的匹配,~用于不区分大小写的匹配,还可使用“!”对匹配进行取反,^~表示若是与特定的字符串进行匹配,那么不在进行正则搜索, =表示精确前缀匹配,只有彻底匹配才能生效,使用彻底匹配能够略微加快请求时间,@定义命名location区段,这些区段客户端不能访问,只能够由内部产生的请求来访问,如try_files或error_page等
location = / { return "规则A"; } location ^~ /static/ { return "规则B"; } location ^~ /static/files { return "规则C"; } location ~ .*\.(gif|jpg|png|js|css)$ { return "规则D"; } location ~* \.png$ { return "规则E"; } location /img { return "规则F"; } location / { return "规则G";
root和alias均可以定义在location模块中,都是用来指定请求资源的真实路径
location /wanger { root html; index index.html; } curl 127.0.0.1/wanger/index.html I'm wanger
客户端请求http://127.0.0.1/wanger/index.html 地址时,在服务器的资源是/html/wanger/index.html,真实路径是root加上location指定的值
location /wanger { alias html/; index index.html; }
而alias是location指定的值的别名,也就是当客户端请求http://127.0.0.1/wanger/index.html 时,在服务器的资源时/html/index.html,真实路径是alias的路径,此时访问结果以下:
curl 127.0.0.1/wanger/index.html I'm huazai
欢迎关注我的微信公众号“没有故事的陈师傅”