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: 'attachment;';
}
}
|
实例:用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, image/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
待续。。。
本文转自rshare 51CTO博客,原文链接:http://blog.51cto.com/1364952/1957763,如需转载请自行联系原作者