|
一:nginx
Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器;
作为一款轻量级的Web服务器,具有占有内存少,并发能力强等优势,是高连接并发场景下Apache的不错的替代品;
本篇主要介绍Nginx如何作为Web反向代理服务器.
特点:非阻塞,调用数据时磁盘i/o的第一阶段,(磁盘加载到内核内存)是非阻塞.
事件通知机制.通信机制采用epoll模型可以连接众多客户端请求.
一个MASTER有多个worker,一个worker又可以响应多个用户请求.
二:反向代理服务器
在计算机网络中,反向代理是代理服务器的一种。它根据客户端的请求,从后端的服务器上获取资源,然后再将这些资源返回给客户端。与前向代理不同,前向代理作为一个媒介将互联网上获取的资源返回给相关联的客户端,而反向代理是在服务器端作为代理使用,而不是客户端。
三:nginx的配置文件解析
1)全局配置段
main #全局配置段
#user nobody; #进程运行用户和用户组
worker_processes 1; #指定nginx运行的进程数一般比CPU总数少一个.
#error_log logs/error.log; #错误日志
#error_log logs/error.log notice; #notice为日志定义的级别
#error_log logs/error.log info;
#pid logs/nginx.pid; #为了指定PID进程位置
events {
worker_connections 1024; #events个数
}
注:计算一台nginx服务器可以连接请求数为:work_processes*worker_connections;如果nginx作为代理服务器时要用(work_processes*worker_connections)/4 ;因为一个nginx作为代理服务器时他要一手托两家, 2)HTTP服务器配置段
http {
include mime.types; #配置对配置文件所包含的设定.
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '#定义日志输出格式
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main; #定义日志输出的格式
sendfile on; #开启文件传输高速
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; #用于设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接
upstream webserver #负载均衡模块
{
server 172.16.16.1 weight=3;
server 172.16.16.4 weight=1;
server 127.0.0.1:8080 backup;
}
# match webcheck
# {
# status 200;
# header Content-Type = text/html;
# body ~ "OK";
# }
#gzip on;
三:定义nginx的基本访问功能
这里配置包含了定义nginx的虚拟主机,添加压缩选项,访问控制,防盗链,和显示连接状态.
1)nginx之虚拟机配置
nginx也可以像Apache那样创建虚拟主机
server {
listen 80;
server_name www.a.com; #定义第一个虚拟主机
#对www.a.com 进行压缩
location / { #家目录
root /www/a.com;
index index.html index.htm;
}
}
server {
listen 80 ;
server_name www.b.org; #定义第二个虚拟主机
root /www/b.org;
location /admin/
{
root /www/b.org; #定义家目录所在
index index.html index.htm;
}
} 关于URL匹配配置
location [ = | ~ | ~* | ^~ ] 优先级
- location = URI {}:精确匹配指定的路径,不包括子路径,因此,只对当前资源生效;(优先级最高)
- location ^~ URI {}:不使用正则表达式;(优先级次之)
- location ~ URI {},location ~* URI {}:模式匹配URI,此处的URI可使用正则表达式,~区分字符大小写,~*不区分字符大小写;(优先级次之)
- location URI {}:对当前路径及子路径下的所有对象都生效;(优先级最低)
2)nginx压缩
server {
listen 80;
server_name www.a.com; #定义第一个虚拟主机
gzip on; #对www.a.com 进行压缩,开启压缩
gzip_http_version 1.0; #压缩http版本
gzip_comp_level 2; #压缩级别9级为最高
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/json;
gzip_disable msie6; #压缩支持的类型
location / {
root /www/a.com;
index index.html index.htm;
}
} 3)访问控制
设置访问某个目录需要进行用户登录
server {
listen 80;
server_name www.a.com;
gzip on;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/json;
gzip_disable msie6;
location / {
root /www/a.com;
index index.html index.htm;
}
}
server {
listen 80 default_server;
server_name www.b.org;
root /www/b.org;
#deny 172.16.16.16;
#allow 172.16.0.0/16;
#deny all;
location /admin/
{
root /www/b.org;
auth_basic "admin area"; #在/admin 下访问要输入密码
auth_basic_user_file /etc/nginx/.htpasswd; #密码文件放置位置
}
生成密码时借助Apache的htpasswd来生成用户名和密码.
htpasswd -c -m /etc/nginx/.htpasswd tom #借助http的密码添加工具添加访问控制用户.
htpasswd -m /etc/nginx/.htpasswd tom #第二次添加用户时不用在加上-c选项.
4)搭建下载服务器
server {
listen 80 default_server;
server_name www.b.org;
root /www/b.org;
location /download/
{
root /www/b.org/; #在/down创建一个下载站
autoindex on;
}
}
5)创建访问IP限制功能
server {
listen 80 default_server;
server_name www.b.org; #定义第二个虚拟主机
root /www/b.org;
deny 172.16.16.16; #拒绝172.16.16.16 这台主机访问
allow 172.16.0.0/16; #允许172.1.0.0/16网段的主机进行访问
deny all; #除了上面的网段主机访问然后拒绝所有
location /admin/
{
root /www/b.org;
auth_basic "admin area"; #在/admin 下访问要输入密码
auth_basic_user_file /etc/nginx/.htpasswd; #密码文件放置位置
}
}
6)URL重定向
server {
listen 80 default_server;
server_name www.b.org; #定义第二个虚拟主机
root /www/b.org;
location /download/
{
root /www/b.org/; #在/down创建一个下载站
autoindex on;
rewrite ^/download/(.*\.(jpg|gif|jepg|png))$ /images/$1 break; }
#访问/download下的图片时都会把地址重写到一个新的目录里/images/下
}
7)查看连接状态
server {
listen 80 default_server;
server_name www.b.org;
root /www/b.org;
location /server-status
{
stub_status on;
#显示连接状态.发起请求数,接受请求数.请求数发起的连接数.
}
}
8)nginx防盗链
server {
listen 80 default_server;
server_name www.b.org;
root /www/b.org;
location ~* /.(jpg|png|gif|jpeg)$
{
root /www/b.org;
valid_referers none blocak www.b.org *.b.org;
#允许www.b.org的网站进行图片引用
if ($invalid_referer)
{
rewrite ^/ http://www.b.org/403.html;
#拒绝其他引用,如果有倒链直接返回403.html
}
}
}
四:实现nginx的负载均衡
负载均衡
http
{
include mime.types;
default_type application/octet-stream;
sendfile on;
#keepalive_timeout 0;
keepalive_timeout 65;
upstream webserver #实现负载均衡.
{
server 172.16.16.1 weight=3 ;
#负载均衡代理 后面的server 修改为 proxy_pass http://webserver/
server 172.16.16.4 weight=1 ;
}
server
{
listen 80;
server_name www.c.net;
location /
{
proxy_pass http://webserver/;
proxy_set_header X-Real-IP $remote_addr;
#显示真实访问主机的IP地址.
}
在被代理的主机上要修改http.conf的配置文件,后可以查看真正主机的访问地址而不是代理服务器的地址.
LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined #添加{X-Real-IP}i %信息
查看日志记录: tail -f /var/log/httpd/access_log
五:nginx的状态检测
http
{
include mime.types;
default_type application/octet-stream;
sendfile on;
#keepalive_timeout 0;
keepalive_timeout 65;
upstream webserver #实现负载均衡.
{
server 172.16.16.1 weight=3 max_fails=1 fail_timeout=3;
#负载均衡代理 后面的server 修改为 proxy_pass http://webserver/
server 172.16.16.4 weight=1 max_fails=1 fail_timeout=3;
#能够自动检测后面的服务是否正常运行.
server 127.0.0.1:8080 backup;
#定义没有后端服务时会出现个维护页面.
}
server
{
listen 80;
server_name www.c.net;
location /
{
proxy_pass http://webserver/;
proxy_set_header X-Real-IP $remote_addr;
#显示真实访问主机的IP地址.
}
server #定义维护页面
{
listen 8080; #定义监听端口为8080
server_name 127.0.0.1;
root /www/backup;
} 当stop node1时 访问www.c.net只会显示node2.
当node1和node2都停掉时会出现事先准备好的维护界面.
六:nginx页面缓存
http
{
include mime.types;
default_type application/octet-stream;
sendfile on;
#keepalive_timeout 0;
keepalive_timeout 65;
upstream webserver #实现负载均衡.
{
server 172.16.16.1 weight=3 max_fails=1 fail_timeout=3;
#负载均衡代理 后面的server 修改为 proxy_pass http://webserver/
server 172.16.16.4 weight=1 max_fails=1 fail_timeout=3;
#能够自动检测后面的服务是否正常运行.
server 127.0.0.1:8080 backup;
#定义没有后端服务时会出现个维护页面.
}
proxy_cache_path /cache/webserver levels=1:2 keys_zone=web:100m max_size=1g inactive=12h; #定义缓存服务.
server
{
listen 80;
server_name www.c.net;
location /
{
proxy_pass http://webserver/;
proxy_set_header X-Real-IP $remote_addr;
#显示真实访问主机的IP地址.
proxy_cache web; #缓存服务名字
proxy_cache_valid 200 2h; #200的缓存2小时
proxy_cache_valid 301 302 10m; #301,302缓存10分钟
proxy_cache_valid any 1m; #其他缓存1分钟
}
server #定义维护页面
{
listen 8080; #定义监听端口为8080
server_name 127.0.0.1;
root /www/backup;
}
不管你怎么刷新页面始终停留在node2页面上,看X-Cache:HIT 说明缓存生效.
七:nginx反向代理服务器
2)修改nginx配置文件
http
{
include mime.types;
default_type application/octet-stream;
sendfile on;
#keepalive_timeout 0;
keepalive_timeout 65;
upstream webserver #实现负载均衡.
{
server 172.16.16.1 weight=3 max_fails=1 fail_timeout=3;
#负载均衡代理 后面的server 修改为 proxy_pass http://webserver/
server 172.16.16.4 weight=1 max_fails=1 fail_timeout=3;
#能够自动检测后面的服务是否正常运行.
server 127.0.0.1:8080 backup;
#定义没有后端服务时会出现个维护页面.
}
proxy_cache_path /cache/webserver levels=1:2 keys_zone=web:100m max_size=1g inactive=12h; #定义缓存服务.
server
{
listen 80;
server_name www.c.net;
add_header X-Cache $upstream_cache_status;
location /
{
proxy_pass http://172.16.16.1/;#反向代理制172.16.16.1/服务器下.
proxy_cache web; #缓存服务名字
proxy_cache_valid 200 2h; #200的缓存2小时
proxy_cache_valid 301 302 10m; #301,302缓存10分钟
proxy_cache_valid any 1m; #其他缓存1分钟
proxy_set_header X-Real-IP $remote_addr;
#显示真实访问主机的IP地址.
}
location ~* \.(jpg|jpeg|png|gif)$
{
proxy_pass http://172.16.16.4; #图片代理至16.4服务
proxy_cache web;
proxy_cache_valid 200 2h;
proxy_cache_valid 301 302 10m;
proxy_cache_valid any 1m;
}
}
server #定义维护页面
{
listen 8080; #定义监听端口为8080
server_name 127.0.0.1;
root /www/backup;
}
} 当访问是图片格式的时候是后面的图片服务器响应;
当访问的是非图片格式时是静态服务器响应.
OK nginx的基本功能就介绍到这下次再讲下nginx的原理性知识. |
|
|