Nginx服务部署
Nginx简介
Nginx (engine x) 是一个轻量级的、高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。是在一个BSD-like 协议下发行。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
官网和资料
官网:http://nginx.org/
中文文档:http://www.nginx.cn/doc/
nginx源码包下载:wget http://nginx.org/download/nginx-1.13.4.tar.gz
nginx官网rpm包下载:http://nginx.org/packages/centos/
Centos6的EPEL源:https://mirrors.tuna.tsinghua.edu.cn/epel/6/x86_64/
Centos7的EPEL源:http://mirrors.sohu.com/fedora-epel/7Server/x86_64/
nginx结构与扩展功能
工作结构:一个主进程(master)和多个工作进程(woker)。工作进程是单线程的,且不需要特殊授权即可运行。
扩展功能
kqueue (FreeBSD 4.1+),epoll (Linux 2.6+),rt signals (Linux 2.2.19+),/dev/poll(Solaris 7 11/99+),select,以及 poll 支持;
kqueue支持的不同功能包括 EV_CLEAR,EV_DISABLE (临时禁止事件), NOTE_LOWAT,EV_EOF,有效数据的数目,错误代码;
sendfile (FreeBSD 3.1+),sendfile (Linux 2.2+),sendfile64 (Linux 2.4.21+),和 sendfilev (Solaris 8 7/01+) 支持;
输入过滤 (FreeBSD4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支持;
10,000 非活动的 HTTP keep-alive 连接仅需要 2.5M内存。
最小化的数据拷贝操作;
其他HTTP功能;
基于IP、端口和名称的虚拟主机服务;
Memcached 的 GET 接口;
支持 keep-alive和管道连接;
灵活简单的配置;
重新配置和在线升级而无须中断客户的工作进程;
可定制的访问日志,日志写入缓存,以及快捷的日志回卷;
4xx-5xx错误代码重定向;
基于 PCRE 的 rewrite 重写模块;
基于客户端IP 地址和 HTTP 基本认证的访问控制;
PUT,DELETE,和 MKCOL 方法;
支持 FLV (Flash 视频);
带宽限制。
Nginx架构原理
大致上Nginx的架构就是这样:
1.Nginx启动后,会产生一个主进程,主进程执行一系列的工作后会产生一个或者多个工作进程;
2.在客户端请求动态站点的过程中,Nginx服务器还涉及和后端服务器的通信。Nginx将接收到的Web请求通过代理转发到后端服务器,由后端服务器进行数据处理和组织;
3.Nginx为了提高对请求的响应效率,降低网络压力,采用了缓存机制,将历史应答数据缓存到本地。保障对缓存文件的快速访问;
##工作进程##
工作进程的主要工作有以下几项:
接收客户端请求;
将请求一次送入各个功能模块进行过滤处理;
IO调用,获取响应数据;
与后端服务器通信,接收后端服务器处理结果;
数据缓存
响应客户端请求;
##进程交互##
Nginx服务器在使用Master-Worker模型时,会涉及到主进程和工作进程的交互和工作进程之间的交互。这两类交互都依赖于管道机制。
1.Master-Worker交互
这条管道与普通的管道不同,它是由主进程指向工作进程的单向管道,包含主进程向工作进程发出的指令,工作进程ID等;同时主进程与外界通过信号通信;
2.worker-worker交互
这种交互是和Master-Worker交互是基本一致的。但是会通过主进程。工作进程之间是相互隔离的,所以当工作进程W1需要向工作进程W2发指令时,首先找到W2的进程ID,然后将正确的指令写入指向W2的通道。W2收到信号采取相应的措施。
Nginx服务器的事件驱动模型
从上面我们可以知道,Nginx服务器的工作进程调用IO后,就取进行其他工作了;当IO调用返回后,会通知工作进程。但IO调用时如何把自己的状态通知给工作进程的呢??
一般解决这个问题有两种方法:
(1)让工作进程在进行其他工作的过程中间隔一段时间就去检查一下IO的状态,如果完成就响应客户端,如果未完成,继续工作。
(2)IO调用在完成后能主动通知工作进程。
当然最好的就是用第二种方法了;像select/poll/epoll等这样的系统调用就是用来支持第二种解决方案的。这些系统调用也常被称为事件驱动模型。他们提供了一种机制就只让进程同时处理多个并发请求,不用关心IO调用的具体状态。IO调用完全由事件驱动模型来管理。
Nginx中的事件驱动模型
就是用事件驱动处理库(多路IO复用),最常用的就是select模型,poll模型,epoll模型。
关于这三个模型的详解在这里可以看到:https://segmentfault.com/a/1190000003063859
nginx安装和配置
安装方法:1、用yum和rpm方式安装 2、编译安装
方法一:用yum安装nginx
实施思路:
1、 下载nginx-*.rpm软件包或配置网络yum源。
2、 用yum或rpm -ivh安装nginx软件。
3、 修改nginx.conf配置文件。
4、 启动nginx服务。本地访问测试。
具体实施:
1、 下载nginx-*.rpm软件包或配置网络yum源。
第1步,配置sohu网络yum源:
vim /etc/yum.repos.d/6sohu.repo | 注:此处是sohu网的Centos6的yum源。 |
[6sohuyum] name=6sohu_yum baseurl=http://mirrors.sohu.com/fedora-epel/7Server/x86_64/ enabled=1 gpgcheck=0 | |
vim /etc/yum.repos.d/6epel.repo | 注:此处是Centos6的epel的yum源。 |
[6epel] name=6epel baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/6/x86_64/ enabled=1 gpgcheck=0 |
vim /etc/yum.repos.d/7sohu.repo | 注:此处是sohu网Centos7的yum源。 |
[7sohuyum] name=7sohu_yum baseurl=http://mirrors.sohu.com/fedora-epel/7Server/x86_64/ enabled=1 gpgcheck=0 | |
vim /etc/yum.repos.d/7epel.repo | 注:此处是Centos7的epel的yum源。 |
[7epel] name=7epel baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/ enabled=1 gpgcheck=0 |
第2步,测试yum源是否可用。
yum clean all yum makecache fast yum repolist yum list nginx |
2、 用yum或rpm -ivh安装nginx软件。
yum install -y pcre-devel openssl-devel zlib-devel curl elinks lynx yum install -y nginx rpm -ql nginx rpm -qc nginx |
技巧:下载网络yum源中的nginx和依赖包到本地主机上。方法如下: 方法一:downloadonly插件(首选) 1.安装插件 yum -y install yum-download 2.下载nginx软件包到当前文件夹的nginx目录中。 yum -y install nginx -downloadonly -downloaddir= ./nginx/
方法二:yum-utils中的yumdownloader 1.安装yum-utils yum -y install yum-utils 2.使用yumdownloader下载软件包nginx yumdownloader nginx
方法三:利用yum的缓存功能 默认情况下,yum在安装软件包后会自动清理软件包,修改配置,使yum不再清理软件包 vim /etc/yum.conf中修改keepcache = 0改为keepcache = 1 /etc/init.d/yum-updatesd restart yum -y install httpd 这时软件包已经安装下载,目录为/var/cache/yum 每一次启程都是从搬砖开始...... |
3、 修改nginx.conf配置文件。
rpm -qc nginx 查看配置文件 |
/etc/logrotate.d/nginx 日志轮滚策略 /etc/nginx/conf.d/default.conf 自动载的默认配置文件 /etc/nginx/conf.d/ssl.conf ssl配置文件 /etc/nginx/conf.d/virtual.conf 虚拟主机配置文件 /etc/nginx/fastcgi.conf fastcgi配置文件(与php交互) /etc/nginx/fastcgi.conf.default fastcgi配置文件的备份 /etc/nginx/fastcgi_params fastcgi参数配置文件 /etc/nginx/fastcgi_params.default fastcgi参数配置文件的备份 /etc/nginx/mime.types 文件类型mime配置文件 /etc/nginx/nginx.conf nginx的主配置文件 /etc/nginx/nginx.conf.default nginx的主配置文件的备份 /etc/nginx/scgi_params scgi参数文件 /etc/nginx/uwsgi_params uwcgi参数文件 /etc/sysconfig/nginx nginx系统配置文件 |
4、 启动nginx服务。本地访问测试。
nginx -t 检测nginx.conf语法 service nginx restart 重启服务 chkconfig nginx on 设为开机启动 curl 127.0.0.1 本地访问测试 elinks 127.0.0.1 本地访问测试 service nginx status 查服务状态 service nginx stop 停止服务 |
查服务的进程: ps aux|grep nginx ps ef|nginx
查服务端口: lsof -i:80 ss -atunlp|grep :80 netstat -atunlp|grep :80 |
方法二:用nginx-*tar.gz源码安装(见最后的附录)。
nginx 1.13.4简单编译安装
软件下载、安装:
#说明:pcre(rewrite功能需要) openssl是提供ssl安全套接字功能,让nginx支持https协议
yum install -y gcc gcc-c++ pcre-devel openssl-devel zlib id nginx ||useradd -r nginx cd ~ wget http://nginx.org/download/nginx-1.13.4.tar.gz ls tar xf nginx-1.13.4.tar.gz cd nginx-1.13.4 ./configure --prefix=/usr/local/nginx \ --conf-path=/etc/nginx/nginx.conf \ --user=nginx \ --group=nginx \ --with-http_ssl_module |
#安装:
make && make install
#设置环境变量:
echo "PATH=$PATH:/usr/local/nginx/sbin/" > /etc/profile.d/nginx.sh
source /etc/profile.d/nginx.sh
export /etc/profile.d/nginx.sh
手动启动nginx:
nginx -t 检测配置文件语法
nginx 启动nginx软件
nginx -h 查看帮助
nginx -v 显示编译安装的参数信息
服务管理:
nginx -s stop/quit 停止
nginx -s reload 重载新配置文件
curl 127.0.0.1 或 firefox 127.0.0.1 &
lsof -i:80 或ss -atunlp|grep :80 或netstat -atunlp|grep :80
说明:nginx官方没有提供服务启动脚本,需要自己写服务启动脚本。
nginx完整安装参考
软件下载
yum install -y gcc gcc-c++ pcre-devel openssl-devel
cd ~
wget http://nginx.org/download/nginx-1.13.4.tar.gz
ls
tar xf nginx-1.13.4.tar.gz
编译安装方法:
准备工作:安装编译器和依赖的软件 |
yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel |
Nginx模块必须在编译的时候指定,完整的编译选项,可用的模块可以参考安装指导下面是一个例子:id nginx || useradd -r nginx cd ~/nginx-1.13.4 ./configure \ --prefix=/usr/local/nginx \ --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --pid-path=/var/run/nginx/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_flv_module \ --with-http_gzip_static_module \ --http-log-path=/var/log/nginx/access.log \ --http-client-body-temp-path=/var/tmp/nginx/client/ \ --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ |
编译和安装:make && make install && echo ok |
更多编译参数与可用的模块信息请运行./configure --help |
启动关闭nginx
## 检查配置文件是否正确
#/usr/sbin/nginx -t
#mkdir -pv /var/tmp/nginx/client/
# nginx -h #查看帮助
# nginx -V # 可以看到编译选项
## 启动、关闭
# nginx # 默认配置文件conf/nginx.conf,-c 指定
# ./sbin/nginx -s stop
或 pkill nginx
测试访问:curl 127.0.0.1 或 firefox 127.0.0.1 &
默认主页index.html的目录:ls /usr/local/nginx/html/
nginx简易的服务脚本:
vi /etc/init.d/nginx |
#!/bin/bash #chkconfig: - 85 15 nginx='/usr/local/nginx/sbin/nginx' case $1 in start) $nginx -t && $nginx && echo start ok ;; stop) $nginx -s stop && echo stop ok ;; reload) $nginx -t && $nginx -s reload || $nginx -s stop ;; restart) $nginx -s stop && echo stop ok $nginx -t && $nginx && echo start ok ;; *) echo "Usage nginx {start|stop|reload|restart}" ;; esac |
添加x权限并测试: chmod +x /etc/init.d/nginx service nginx restart
|
nginx专业级服务脚本:
vi /etc/init.d/nginx 内容如下 |
#!/bin/bash # chkconfig: - 30 21 # description: http service. # Source Function Library . /etc/init.d/functions # Nginx Settings NGINX_SBIN="/usr/local/nginx/sbin/nginx" NGINX_CONF="/etc/nginx/nginx.conf" NGINX_PID="/usr/local/nginx/logs/nginx.pid" RETVAL=0 prog="Nginx" start() { echo -n $"Starting $prog: " mkdir -p /dev/shm/nginx_temp daemon $NGINX_SBIN -c $NGINX_CONF RETVAL=$? echo return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc -p $NGINX_PID $NGINX_SBIN -TERM rm -rf /dev/shm/nginx_temp RETVAL=$? echo return $RETVAL } case $1 in start) start [ $? -eq 0 ] && echo "nginx ok" || echo "nginx error" ;; stop) stop [ $? -eq 0 ] && echo "nginx ok" || echo "nginx error" ;; restart) stop && start [ $? -eq 0 ] && echo "nginx ok" || echo "nginx error" ;; *|"") echo $"Usage:nginx {start|stop|restart|status}." ;; esac |
nginx.conf主配置文件
nginx配置文件结构(rpm方式)
cat -n /etc/nginx/nginx.conf |
user nginx; 进程用户 worker_processes 1; 进程数(双核CPU可设置为2) error_log /var/log/nginx/error.log; 错误日志 #error_log /var/log/nginx/error.log notice; 错误日志为notice等级 #error_log /var/log/nginx/error.log info; 错误日志为info等级 pid /var/run/nginx.pid; 进程的pid文件 events { 事件设置 worker_connections 1024; 单个进程最在连接数 }
http { 配置http服务参数 include /etc/nginx/mime.types; 包含mime支持类型的配置文件 default_type application/octet-stream; 默认类型
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 定义main日志文件格式 '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main; 访问日志 sendfile on; 开启sendfile功能 #tcp_nopush on; 不启用tcp_nopush功能 #keepalive_timeout 0; keepalive_timeout 65; 指定保持连接的超时时间 #gzip on; 是否启用gzip功能 # Load config files from the /etc/nginx/conf.d directory # The default server is in conf.d/default.conf include /etc/nginx/conf.d/*.conf; 包含分支配置文件(启动服务时加载这些配置文件) } 结束http参数配置 |
default.conf默认网站配置文件
cat /etc/nginx/conf.d/default.conf | |
# The default server 设置服务器配置文件(80端口的虚拟主机) server { 虚拟主机配置 listen 80 default_server; 监听80端口,并设置为默认服务器 server_name _; 服务器域名 #charset koi8-r; 网站字符编码设置 #access_log logs/host.access.log main; 访问日志类型为main类型 location / { 位置匹配设置 root /usr/share/nginx/html; 网站根目录 index index.html index.htm; 默认主页文件名列表 } 位置设置结束
error_page 404 /404.html; 404错误代码及页面 location = /404.html { 位置匹配设置 root /usr/share/nginx/html; 位置的根目录 } 位置设置结束
# redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; 500~504错误代码及页面 location = /50x.html { 位置匹配设置 root /usr/share/nginx/html; 位置根目录 } 匹配位置结束 # proxy the PHP scripts to Apache listening on 127.0.0.1:80 代理PHP由后端的apache处理 #location ~ \.php$ { 匹配以.php为后缀的设置 # proxy_pass http://127.0.0.1; 后端web服务器IP地址及协议 #} 匹配设置结束 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 #将PHP脚本发给端口为9000的FastCGI服务器处理, #location ~ \.php$ { 匹配以.php为后缀的设置 # root html; 网站根目录 # fastcgi_pass 127.0.0.1:9000; 指定fastcgi服务器的IP和端口号 # fastcgi_index index.php; 指定主页文件 # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 脚本文件名 # include fastcgi_params; 包含fastcgi_params参数配置文件 # include fastcgi.conf; 包含fastcgi.conf配置文件 #} 匹配设置结束
# deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { 匹配.ht的文件 # deny all; 设置权限为拒绝访问 #} 匹配设置结束 } 虚拟主机配置结束(与开头的server{的大括号配对) |
nginx虚拟主机配置
cat /etc/nginx/conf.d/virtual.conf | 虚拟主机配置文件模板 |
# A virtual host using mix of IP-, name-, and port-based configuration #server { 定义虚拟主机 # listen 8000; 指定监听端口 # listen somename:8080; 指定域名和监听端口 # server_name somename alias another.alias; 指定服务器域名 # location / { 位置设置 # root html; 网站根目录(html位于/usr/share/nginx/html),可用绝对路径 # index index.html index.htm; 网站默认主页文件名 # } 位置设置结束 #} 虚拟主机设置结束 |
虚拟主机:在一台nginx服务器上发布多个不同的网站。
实现nginx虚拟主机的方法(三种方案可以综合应用):
1、 基于端口:将不同的网站绑定在不同的端口。
2、 基于IP:将不同的网站绑定在不同的IP地址。
3、 基于域名:将不同的网站绑定在不同的域名。需要在hosts文件或DNS服务器上登记域名和IP地址的对应解析关系。
练习:在nginx服务器上创建一个网站根目录/web/8080,并创建index.html主页,用nginx虚拟主机基于端口的方式发布这个网站,用独立的配置文件8080.conf,重启nginx服务后,并在本地做访问测试。
第1步,创建网站根目录和主页。 |
mkdir -pv /web/8080 echo www.8080.com > /web/8080/index.html |
第2步,创建8080.conf配置文件,将网站绑定在8081端口进行发布。 |
cd /etc/nginx/conf.d cp -v virtual.conf 8080.conf vi 8080.conf 修改后的内容如下 |
server { listen 8080; #listen somename:8080; server_name www.8080.com 8080 8080.com; access_log /web/8080/access.log main; error_log /web/8080/error.log; location / { root /web/8080; index index.html index.htm; } } |
第3步,检测配置文件语法,重启服务,本地访问测试。 |
nginx -t service nginx restart curl 127.0.0.1:8080 ; elinks 127.0.0.1:8081 本地访问测试 |
任务:参考/web/8080目录的网站发布的方法,将/web/8081目录的网站绑定在8081端口进行发布,并做访问测试。
Nginx文件共享:
文件共享设置
方法一:(首选)用nginx自带的index文件列表索引功能实现,只需要添加全局设置参数即可。也可以将autoindex功能代码添加到location代码段中 |
location / { root /var; #根目录路径 autoindex on; # 显示目录 autoindex_exact_size on; # 显示文件大小 autoindex_localtime on; # 显示文件时间 limit_rate_after 5m; #5m之后下载速度为10k limit_rate 10k; #限速10k #alias /usr/local; #别名 } |
方法二:(备用)在location匹配代码段中用if对请求的文件类型判断,指定访问某些格式的文件时才会提示下载。 |
location / { #root html; #index index.html index.htm; if ($request_filename ~* ^.*?\.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$){ add_header Content-Disposition: 'p_w_upload;'; } } |
实例:用nginx基于端口的方式发布/var目录,绑定在8001端口,实现文件共享功能。
第1步,修改配置文件。vim /etc/nginx/conf.d/8001.conf |
server { listen 8001; #listen somename:8001; server_name www.8001.com 8001 8001.com; access_log /var/8001_access.log main; error_log /var/8001_error.log; location / { root /var; index index.html index.htm; autoindex on; autoindex_exact_size on; autoindex_localtime on; } } |
第2步,重启nginx服务,本地访问测试。(elinks是用q键退出) |
nginx -t && nginx -s reload elinks 127.0.0.1:8001 (elinks是用q键退出) |
nginx访问控制表
访问控制表相关指令:allow、deny(ngx_http_access_module)
单看nginx模块名ngx_http_access_module,很多人一定很陌生,但是deny和allow相比没一个人不知道的,实际上deny和allow指令属于ngx_http_access_module.我们想控制某个uri或者一个路径不让人访问,在nginx就得靠它了。
nginx的访问控制模块语法很简单,至少比apache好理解,apache的allow和deny的顺序让很多初学者抓头.好了具体看下这个插件的使用方法吧。
1、安装模块
这个模块内置在了nginx中,除非你安装中使用了--without-http_access_module。如果你还没安装过nginx,那么请参考下ttlsa之前写的nginx安装.
2、指令
allow
语法: allow <address | CIDR | unix: | all>;
默认值: —
配置段: http, server, location, limit_except
实例:allow 192.168.10.0/24;
允许某个ip或者一个ip段访问.如果指定unix:,那将允许socket的访问.注意:unix在1.5.1中新加入的功能,如果你的版本比这个低,请不要使用这个方法。
deny
语法: deny <address| CIDR | unix: | all>;
默认值: —
配置段: http, server, location, limit_except
禁止某个ip或者一个ip段访问.如果指定unix:,那将禁止socket的访问.注意:unix在1.5.1中新加入的功能,如果你的版本比这个低,请不要使用这个方法。
3. allow、deny实例
location / {
deny 192.168.10.1;
allow 192.168.10.0/24;
allow 192.168.20.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
从上到下的顺序,类似iptables。匹配到了便跳出。如上的例子先禁止了192.16.1.1,接下来允许了4个网段,其中包含了一个ipv6,最后未匹配的IP全部禁止访问.在实际生产环境中,我们也会使用nginx 的geo模块配合使用,有兴趣的请参考ttlsa相关文章nginx geo使用方法.
4. 结束语
nginx访问控制模块要数nginx里面最简单的指令,只要记住你想禁止谁访问就deny加上IP,想允许则加上allow ip,想禁止或者允许所有,那么allowall或者deny all即可.
实例:在上一例的8001端口的文件共享的location /代码段中使用deny和allow访问共享控制功能,禁止192.168.10.1、192.168.20.1的主机访问共享,允许其他任何主机访问共享。
第1步,修改配置文件。vim /etc/nginx/conf.d/8001.conf |
server { listen 8001; #listen somename:8001; server_name www.8001.com 8001 8001.com; access_log /var/8001_access.log main; error_log /var/8001_error.log; location / { root /var; index index.html index.htm; autoindex on; autoindex_exact_size on; autoindex_localtime on; deny 192.168.10.1; deny 192.168.20.1; allow all; } } |
第2步,重启nginx服务,在物理机上做访问测试。(elinks是用q键退出) |
nginx -t && nginx -s reload elinks 192.168.10.25:8001 (elinks是用q键退出) firefox 192.168.10.25:8001 |
nginx身份认证
基于Basic Auth认证
Nginx提供HTTP的Basic Auth功能,配置了Basic Auth之后,需要输入正确的用户名和密码之后才能正确的访问网站。
我们使用htpasswd来生成密码信息,首先要安装httpd-tools,在httpd-tools中包含了htpasswd命令。
Basic Auth配置代码
server { listen 8001; #listen somename:8001; server_name www.8001.com 8001 8001.com; access_log /var/8001_access.log main; error_log /var/8001_error.log; location / { root /var; index index.html index.htm; auth_basic "Restricted"; 基本身份认证对话框的名称 auth_basic_user_file /etc/nginx/.htpasswd; 用户账号文件 } } |
实例:对上前面例子中8000端口的网站(/var目录共享)做Basic Auth基本身份认证。只有当用户输入正确的账号和密码才能访问共享。
第1步,安装httpd-tools软件包。软件包中带有htpwd命令,用来生成用户认证账号文件。 |
yum install -y httpd-tools |
第2步,用htpasswd创建用户和密码。创建用户lucy、tom、jim。密码都为01。 |
htpasswd -bmc /etc/nginx/.htpwd lucy 01 htpasswd -bm /etc/nginx/.htpwd tom 01 htpasswd -bm /etc/nginx/.htpwd jim 01 cat /etc/nginx/.htpwd |
第3步,修改8001.conf配置文件,设置认证功能。vi /etc/nginx/conf.d/8001.conf |
server { listen 8001; #listen somename:8001; server_name www.8001.com 8001 8001.com; location / { root /var; index index.html index.htm; autoindex on; autoindex_exact_size on; autoindex_localtime on; auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpwd; } } |
第4步,重启nginx服务,在物理机或虚拟机本地做访问测试。(elinks是用q键退出) |
nginx -t && nginx -s reload elinks 192.168.10.25:8001 (elinks是用q键退出) firefox 192.168.10.25:8001 curl 192.168.10.25:8001 -u lucy:01 |
nginx.conf配置文件功能汇总
配置文件目录
/usr/local/nginx/conf/nginx.conf
http基础配置(/usr/local/nginx/conf/nginx.conf-> http{})
server_tokens默认值是on,表示显示版本信息,设置server_tokens值是off,就可以在所有地方隐藏nginx的版本信息。
gzip压缩技术(/usr/local/nginx/conf/nginx.conf-> http{})
gzip on;
gzip_min_length 1024;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_vary on;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
负载均衡&反向代理
http{}
upstream servers {
server 192.168.20.11:80 max_fails=2 fail_timeout=60s weight=1;
#none; 轮询(weight决定,默认为1)
#ip_hash; 客户端ip请求hash均衡
#fair; 自动分配到服务器
#url_hash; 当前请求的hash均衡
#weight;权重,值越高负载越大
server URL weight = 5;
#backup;备份机,只有非备份机全部挂掉情况下,才启动
server URL backup;
#down;停机标志,不会被访问,临时升级维护
server URL down;
#max_fails;达到指定次数认为服务器挂掉,并终止此接受访问
#fail_timeout;服务器挂掉多久后再去尝试是否已恢复
server URL max_fails=2 fail_timeout=60s;
}
location / {
proxy_pass http://servers;
#以下是一些反向代理的配置,可选。
proxy_redirect off; #如果需要修改从被代理server传来的应答头中的"Location"和"Refresh"字段,可以用这个指令设置。
proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header; #指定故障转移策略,当后端节点返回500,502,503,等执行超时错误时,自动将请求转发到upstream组的另一台服务器,实现故障转移。
proxy_set_header X-Real-IP $remote_addr;#记录客户机IP,X-Real-IP变量名,可以随便修改
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host $host;#指定后端server获取Client的主机名和地址以及代理的真实IP
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;#设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
缓存配置(/usr/local/nginx/conf/nginx.conf-> http{} - server{})
location~ .*\.(jpg|png|gif)$ {
#配置到图片上级目录
#如页面访问的是http://127.0.0.1/public/6DD309BF50C11AC5DE277A5F5C147330.png
#配置为root D:\\_webapp\\ParityPlatform\\WEB-INF\\classes\\static;
#完整路径如下D:\_webapp\ParityPlatform\WEB-INF\classes\static\public\6DD309BF50C11AC5DE277A5F5C147330.png
root /app/webapps/;
# 2天后自动清除缓存
expires 2d;
}
location~ .*\.(js|css)$ {
root /app/webapps/;
expires 1h;
}
查看Nginx状态配置
#设定查看Nginx状态的地址
location /NginxStatus {
# Turn on nginx stats
stub_statuson;
# I do not need logs for stats
access_log off;
# Security: Only allow access from 192.168.1.100 IP #
#allow 192.168.1.100;
# Send rest of the world to /dev/null #
#deny all;
}
负载均衡时session处理
1. 利用nginx中upstream为ip_hash策略(简单快速,业务场景允许非重要性)
2. 网络广播session同步(缺陷:数据量大时性能低下、网络容易造为性能瓶颈、集群环境中容器过多时性能下降)
2.1 tomcat中,/tomcat/conf/server.xml
<Enginename=“”。。。>
添加如下代码
`<ClusterclassName="org.apache.catalina.ha.tcp.SimpleTcpCluster" />`
<!-- <channel>...</channel> 对应配置信息,防止一台服务器多个tomcat造成异常-->
</Engine>
2.2 在应用添加信息,通知tomcat/告知应用是处于集群环境中,支持分布式部署
应用的web.xml中添加如下
`<distributable />`
3. 共享空间保存session信息(分布式缓存技术【redis\memcached】)
3.1 安装memcached
Nginx反向代理+负载均衡(案例)
HttpProxyModule 代理模块
HttpUpstreamModule 负载均衡模块
注:以上两个模块为Nginx默认加载模块。
反向代理(Reverse Proxy)方式是指以前端的代理服务器来接受internet上的连接请求,然后将请求转发给后端内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
整体思路构架:
nginx.conf全局设置
http {
upstream backend { 定义一个名称为backend的服务器池
server 192.168.20.11;
server 192.168.20.12;
server 192.168.20.13;
....
}
server{
listen 80; #监听端口
server_name www.up.com; #nginx调度器FQDN域名
location / {
proxy_pass http://backend; 代理转发给名称为backend的服务器池
proxy_set_header X-Real-IP $remote_addr; #记录客户端真实IP
proxy_set_header Host $Host; #记录代理服务器IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录上一级代理服务器IP
}
}
}
说明:可以用upstream指令定义多个不同名称的服务器池,将不同域名的网站调度给不同的后端web服务器池。
实施步骤:
1、 环境搭建
3台web主机IP信息
功能 | 安装软件 | IP地址 | 主机名 |
调度器 | nginx | eth0:192.168.10.25 eth1:192.168.20.8 | node25.example.com |
Web1 | nginx或apache | 192.168.20.11 | node11.example.com |
Web2 | nginx或apache | 192.168.20.12 | node12example.com |
2、 调度器设置
vim /usr/local/nginx/conf/nginx.conf
http { 找到此行,添加如下绿色内容
upstream servers {
server 192.168.20.11:80 max_fails=3 fail_timeout=30s weight=1;
server 192.168.20.12:80 max_fails=3 fail_timeout=30s weight=2;
server 192.168.20.13:80 max_fails=3 fail_timeout=30s weight=3;
}
server{
listen 8088;
server_name www.up.com;
location / {
proxy_pass http://servers;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $Host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
说明:1、max_fails=3和fail_timeout=30s是对后端服务器做健康检测,weight是权重,数字越大优先级越高。
2、max_fails是错误的最大次数。fail_timeout是指max_fails次后的暂停时间。
3、 后端web服务器设置
说明:后端的web服务器分别为192.168.20.11和192.168.20.12,我们用apache实现。
web1服务器192.168.20.11执行以下任务(复制代码执行)
yum install -y httpd echo "ServerName www.up.com" > /etc/httpd/conf.d/srv.conf service httpd restart chkconfig httpd on echo "www.up11.com" > /var/www/html/index.html curl 127.0.0.1 |
web1服务器192.168.20.12执行以下任务(复制代码执行)
yum install -y httpd echo "ServerName www.up.com" > /etc/httpd/conf.d/srv.conf service httpd restart chkconfig httpd on echo "www.up12.com" > /var/www/html/index.html curl 127.0.0.1 |
4、 客户端访问测试。
第1步:修改hosts文件。
vim /etc/hosts 添加如下内容
192.168.10.25 www.up.com
测试:ping -c 2 www.up.com
第2步:访问调度器。
curl 192.168.10.25 或 curl www.up.com
curl 192.168.10.25 或 curl www.up.com
firefox 192.168.10.25 & 或 firefox www.up.com &
说明:在firefox浏览器中刷新操作,看到页面有变化说明负载均衡调度成功
HTTP协议的header头部字段,常见的如下:
X-Real-IP | 在<转发请求>中,设置:记录真实发出请求的客户端IP地址($remote_addr客户端IP变量)。 如: <客户端请求头>中的<X-Real-IP>信息,被添加了<192.168.100.2\r\n>(客户端真实IP地址) |
Host | 在<转发请求>中,设置:HTTP的header头部的Host值。$Host是记录代理服务器的IP。 如果<不设置proxy_set_header Host>,则: <客户端请求头>中<HOST>信息,默认等于<proxy_pass指令值>,如<Host: 192.168.100.12\r\n>(后端服务器IP地址) 如果<设置proxy_set_header Host $Host>,则: <客户端请求头>中<HOST>信息,被设置为<代理服务器IP地址>,如<Host: 192.168.100.11\r\n>(代理服务器IP地址) |
X-Forwarded-For | 在<转发请求>中,设置:记录上一级代理服务器IP地址($proxy_add_x_forwarded_for变量)。 X-Forwarded-For头信息可以有多个,中间用逗号分隔,第一个为真实的客户端ip,剩下的就是曾经经过的代理或负载均衡的ip地址,经过几个就会出现几个。 如: <客户端HTTP请求头>中的<X-Forwarded-For>信息,被添加了<X-Forwarded-For: 192.168.100.2\r\n>。 |
5、抓包分析
## 在后端服务器上(192.168.20.11),执行tcpdump -i eth0 -w tcp.pcap,然后用Wireshark来查看分析tcp.pcap文件
#推送tcp.pcap包文件到物理:scp tcp.pcap root@192.168.20.1:/root/
#yum install -y wireshark wireshark-gnome
#wireshark & 如下图
##抓到的tcp.pcap内容如下:
Hypertext Transfer Protocol
GET / HTTP/1.0\r\n
X-Real-IP: 192.168.10.1\r\n
Host: 192.168.20.8\r\n
X-Forwarded-For: 192.168.10.1\r\n
Connection: close\r\n
Accept: text/html, application/xhtml+xml, p_w_picpath/jxr,*/*\r\n
Accept-Language: zh-CN\r\n
Accept-Encoding: gzip, deflate\r\n
DNT: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64;Trident/7.0; rv:11.0) like Gecko LBBROWSER\r\n
If-Modified-Since: Sat, 22 Oct 2016 02:31:03GMT\r\n
If-None-Match: "580acf67-264"\r\n
\r\n
[Full request URI: http://192.168.10.1/]
[HTTP request 1/1]
[Response in frame: 58]
nginx的https功能
nginx中文文档:http://www.nginx.cn/doc/
官方文档:http://www.nginx.cn/doc/optional/ssl.html
待续。。。