常用的反向代理、负载均衡服务器,同时可发布静态文件、实现https、添加缓存。
参考链接1 http://blog.csdn.net/xy2204/article/details/47749405
参考链接2 http://www.nginx.cn/76.html
参考链接3 http://tengine.taobao.org/book/chapter_02.html
安装
CentOS 7.2 64位系统安装
yum install nginx
配置文件位置
/etc/nginx/nginx.conf
常用命令
service nginx {start|stop|status|restart|reload}
nginx
nginx -s {stop|reload}
配置文件
user nginx;
#nginx开启后会启动2个进程master process,worker process。
#本参数指定了master process以外的进程的用户。master process是用root启动的。
worker_processes auto;
#指定Nginx运行时使用的CPU核数。
#设成auto会自动判断CPU的核数。
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
#全局错误日志及PID文件
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
#单个后台worker process进程的最大并发链接数
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 定义日志格式,常用参数如下
#1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;
#2.$remote_user :用来记录客户端用户名称;
#3.$time_local :用来记录访问时间与时区;
#4.$request :用来记录请求的url与http协议;
#5.$status :用来记录请求状态;
#6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
#7.$http_referer :用来记录从那个页面链接访问过来的;
#8.$http_user_agent :记录客户端浏览器的相关信息;。
access_log /var/log/nginx/access.log main;
#记录访问日志,使用main格式
sendfile on;
#指定是否使用OS的sendfile函数来传输文件。
#普通应用应该设为on,下载等IO重负荷的应用应该设为off。默认值是off。
tcp_nopush on;
#sendfile为on时这里也应该设为on,数据包会累积一下再一起传输,可以提高一些传输效率。
tcp_nodelay on;
#小的数据包不等待直接传输。默认为on。
#看上去是和tcp_nopush相反的功能,但是两边都为on时nginx也可以平衡这两个功能的使用。
keepalive_timeout 65;
#HTTP连接的持续时间。设的太长会使无用的线程变的太多。设成0关闭此功能。
#charset UTF-8;
#设置应答的文字格式,最好业务端自己设置
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
#记录请求的原始ip到X-Real-IP中,首层代理设置,用于获取用户IP,后面无需设置,否则会被覆盖
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#添加请求的原始ip到X-Forwarded-For中
gzip on;
#开启gzip压缩
include /etc/nginx/mime.types;
default_type application/octet-stream;
#设定mime类型,类型由mime.type文件定义
server {
listen 80;
server_name localhost 127.0.0.1;
location / {
root /usr/share/nginx/html;
}
#后面重点介绍location
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
# 定义错误提示页面
}
}
root和alias的区别
location /request_path/image/ {
root /local_path/image/;
}
#当客户端请求 /request_path/image/cat.png 的时候
#nginx把请求映射为/local_path/image/request_path/image/cat.png
location /request_path/image/ {
alias /local_path/image/;
}
#当客户端请求 /request_path/image/cat.png 的时候
#nginx把请求映射为/local_path/image/cat.png
location
-
表达式类型
- ~ 表示执行一个正则匹配,区分大小写; ~* 表示执行一个正则匹配,不区分大小写
- ^~ 表示普通字符匹配,使用前缀匹配。如果匹配成功,则不再匹配其他location
- = 进行普通字符精确匹配,也就是完全匹配
- 常规字符串匹配类型,使用前缀匹配。匹配优先级最低。
-
优先级说明
在nginx的location和配置中location的顺序没有太大关系,和location表达式的类型有关。相同类型的表达式,字符串长的会优先匹配。以下是按优先级排列说明:- 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
- ^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
- 正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
- 常规字符串匹配类型,使用前缀匹配。
location = / {
#仅仅匹配请求 /
[ configuration A ]
}
location / {
#匹配所有以 / 开头的请求。
#但是如果有更长的同类型的表达式,则选择更长的表达式。
#如果有正则表达式可以匹配,则优先匹配正则表达式。
[ configuration B ]
}
location /documents/ {
#匹配所有以 /documents/ 开头的请求。
#但是如果有更长的同类型的表达式,则选择更长的表达式。
#如果有正则表达式可以匹配,则优先匹配正则表达式。
[ configuration C ]
}
location ^~ /images/ {
#匹配所有以 /images/ 开头的表达式,如果匹配成功,则停止匹配查找。
#所以,即便有符合的正则表达式location,也不会被使用
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
#匹配所有以 gif jpg jpeg结尾的请求。
#但是 以 /images/开头的请求,将使用 Configuration D
[ configuration E ]
}
负载均衡
http {
upstream one{
server 192.168.1.1:8080 weight=3;
server 192.168.1.2;
}
#轮询负载,可设置权重值。
#上面的例子在服务器后添加weight=3的配置,这意味着,每接收到4个请求,前3个请求会被分发到第一个服务器,第四个请求会分发到第二个服务器。
#后端机器性能不一致时会用
upstream two{
#least_conn
server 192.168.1.1:8080;
server 192.168.1.2;
}
#请求会被转发到连接数最少的服务器上
#后端机器性能接近时会用
upstream three{
#ip_hash
server 192.168.1.1:8080;
server 192.168.1.2;
}
#同一客户端连续的Web请求可能会被分发到不同的后端服务器进行处理
#希望用户的请求都到某台机器上处理时会用,如查看用户文本日志上下文
server {
listen 80;
location / {
proxy_pass http://one;
}
}
}
缓存
如果使用了proxy_cache模块,nginx启动时还会额外启动两个进程:cache manager和cache loader
http {
proxy_cache_path /usr/share/nginx/proxy_cache levels=1:2 keys_zone=one:200m inactive=1d max_size=10g;
#设置Web缓存区名称为cache1
#内存缓存空间大小为200MB
#1天没有被访问的内容自动清除
#硬盘缓存空间大小为10GB。
#levels=1:2 表示缓存目录的第一级目录是1个字符,第二级目录是2个字符,即/usr/share/nginx/proxy_cache/cache1/a/1b这种形式
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:8080;
# nginx不会对root以及alias做缓存
proxy_cache one;
#设置资源缓存的zone
proxy_cache_key $host$uri$is_args$args;
#设置缓存的key,以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
proxy_cache_valid 200 304 12h;
#对不同的HTTP状态码设置不同的缓存时间
expires 1d;
#缓存时间
proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
#忽略原始服务器上的响应设置
proxy_hide_header Cache-Control;
#隐藏Cache-Control
proxy_hide_header Set-Cookie;
#隐藏Set-Cookie
add_header Cache-Status "$upstream_cache_status";
#添加响应码
}
}
}
https
https主要是出于传输安全考虑,具体怎么做到安全的,可以参考这篇文章
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name _;
root /usr/share/nginx/html;
ssl_certificate "/etc/pki/nginx/server.crt";#证书路径
ssl_certificate_key "/etc/pki/nginx/private/server.key";#key路径
ssl_session_cache shared:SSL:1m; #储存SSL会话的缓存类型和大小
ssl_session_timeout 10m;#会话过期时间
ssl_ciphers HIGH:!aNULL:!MD5;#为建立安全连接,服务器所允许的密码格式列表
ssl_prefer_server_ciphers on;#依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
location / {
}
}
rewrite
- rewrite break - url重写后,直接使用当前资源,不再执行location里余下的语句,完成本次请求,地址栏url不变
- rewrite last - url重写后,马上发起一个新的请求,再次进入server块,重试location匹配,超过10次匹配不到报500错误,地址栏url不变
- rewrite redirect – 返回302临时重定向,地址栏显示重定向后的url,爬虫不会更新url(因为是临时)
- rewrite permanent – 返回301永久重定向, 地址栏显示重定向后的url,爬虫更新url