什么是nginx?
NGINX是一个免费的,开源的,高性能的HTTP服务器和反向代理,以及IMAP / POP3代理服务器。NGINX以其高性能,稳定性,丰富的功能集,简单的配置和低资源消耗而闻名。
NGINX是用于Web服务,反向代理,缓存,负载平衡,媒体流等的开源软件。它最初是一个旨在实现最高性能和稳定性的Web服务器。除了HTTP服务器功能外,NGINX还可以用作电子邮件(IMAP,POP3和SMTP)的代理服务器以及HTTP,TCP和UDP服务器的反向代理和负载平衡器。
yum install yum-utils
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
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
添加用户和组
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/)查看指令存在的位置,而最上方不属于任何块的配置指令的区域属于主配置区,用于定义网站的全局配置
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请求的过程,就是基于事件驱动模型的,事件驱动模型包括事件收集器,事件发送器,事件处理器,事件收集器负责收集所有事件,事件包括来自软件、硬件以及用户的,事件发送器负责将收集器收集到的事件发送到目标对象,事件处理器负责具体事件的响应,事件包括读事件,写事件以及异常事件。
为三类事件分别创建一个事件描述符集合,分别用来收集读事件的描述符、写事件的描述符和异常事件的描述符,调用底层select()函数,等待事件发生。然后遍历三个集合中的事件描述符,当检测到事件发生时就处理该事件,select受最大文件描述符的限制
为三类事件创建一个集合,最后轮询的时候,可以同时检查这三种事件是否发生
把描述符列表的管理交给内核负责,一旦有某种事件发生,内核把发生事件的描述符列表通知给进程,这样就避免了轮询整个描述符列表。epoll库通过相关调用通知内核创建一个待处理的事件列表,当某一事件发生后,内核将发生事件的描述符列表上报给epoll库,得到事件列表的epoll库,就可以进行事件处理了。
nginx变量索引:http://nginx.org/en/docs/varindex.html
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
[root@wanger]# curl -xlocalhost:80 huazai.com
I'm huazai
[root@wanger]# 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";
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