nginx
1.下载与安装
wget http://nginx.org/download/nginx-1.15.5.tar.gz
wget https://www.openssl.org/source/openssl-1.1.1.tar.gz
wget http://211.162.127.1/files/5239000003EB6FBA/zlib.net/zlib-1.2.11.tar.gz
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.42.tar.gz
yum install gcc-c++
openssl安装
tar zxvf openssl-1.1.1.tar.gz -C /usr/local/
cd /usr/local/openssl-1.1.1/
./confige && make && make install
出现Operating system: x86_64-whatever-linux2 You need Perl 5.异常需要安装如下
wget https://www.cpan.org/src/5.0/perl-5.28.0.tar.gz
./Configure -des -Dprefix=$HOME/localperl
make
make test //很慢
make install
其他安装解压后
./configure && make && make install 即可
2.启动,关闭,重启
nigix的启动 ./nginx 关闭./nginx -s stop 重启./nginx -s reload
查看进程是否启动
查看连接是否正常
3.配置文件简要说明
#user nobody; worker_processes 1; #工作进程:数目。根据硬件调整,通常等于cpu数量或者2倍cpu数量。 #错误日志存放路径 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; # nginx进程pid存放路径 events { worker_connections 1024; # 工作进程的最大连接数量 } http { include mime.types; #文件扩展名与文件类型映射表 default_type application/octet-stream; #默认文件类型 # 日志格式设置 main的格式 这个位置相于全局设置 #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; #用log_format指令设置日志格式后,需要用access_log来指定日志文件存放路径,没有会创建 sendfile on; #指定nginx是否调用sendfile函数来输出文件,对于普通应用,必须设置on。
#如果用来进行下载等应用磁盘io重负载应用,可设着off,以平衡磁盘与网络io处理速度,降低系统uptime。 #tcp_nopush on; #此选项允许或禁止使用socket的TCP_CORK的选项,此选项仅在sendfile的时候使用 #keepalive_timeout 0; #keepalive超时时间 keepalive_timeout 65; #gzip on; #开启gzip压缩服务
#设定请求缓冲
#client_header_buffer_size 1k;
#large_client_header_buffers 4 4k;
#设定负载均衡的服务器列表
#upstream myproject {
#weigth参数表示权值,权值越高被分配到的几率越大
#max_fails 当有#max_fails个请求失败,就表示后端的服务器不可用,默认为1,将其设置为0可以关闭检查
#fail_timeout 在以后的#fail_timeout时间内nginx不会再把请求发往已检查出标记为不可用的服务器
#}
#webapp
#upstream myapp {
# server 192.168.1.171:8080 weight=1 max_fails=2 fail_timeout=30s;
# server 192.168.1.172:8080 weight=1 max_fails=2 fail_timeout=30s;
#} #虚拟主机 server { listen 80; #配置监听端口号 server_name localhost; #配置访问域名,域名可以有多个,用空格隔开 #charset koi8-r; #字符集设置
#nginx访问日志的存放地址 #access_log logs/host.access.log main;
#返回的相应文件地址 location / {
#设置客户端真实ip地址
#proxy_set_header X-real-ip $remote_addr;
#负载均衡反向代理
#proxy_pass http://myapp; root html; #目录,假如在location中添加了目录,那么会相应的添加在root的值的后面,alias与其有区别是忽略location相应的目录 index index.html index.htm; #文件 } #错误跳转页 #error_page 404 /404.html;
#配置反向代理tomcat服务器:拦截.jsp结尾的请求转向到tomcat
#location ~ \.jsp$ {
# proxy_pass http://192.168.1.171:8080;
#}
# redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。 # root html; #根目录 # fastcgi_pass 127.0.0.1:9000; #请求转向定义的服务器列表 # fastcgi_index index.php; # 如果请求的Fastcgi_index URI是以 / 结束的, 该指令设置的文件会被附加到URI的后面并保存在变量$fastcig_script_name中 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another 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; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; #监听端口 # server_name localhost; #域名 # ssl_certificate cert.pem; #证书位置 # ssl_certificate_key cert.key; #私钥位置 # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; #密码加密方式 # ssl_prefer_server_ciphers on; # ssl_prefer_server_ciphers on; # # location / { # root html; # index index.html index.htm; # } #} }
4. 新增监听端口,在nginx.conf新增server,与nginx.conf的server是兄弟关系(平级)
server { listen 1234; server_name bhz.com; location / { root html; #目录 index index.html index.htm; #文件 }
access_log logs/bhz_access.log main; //监听访问的日志文件 }
5. 日志的分割
shell脚本,进行在相应的时间进行移动改名,然后nginx有自己新建文件,可以采用停机启动来防止文件的写入
6. nginx指令
6.1 location
匹配模式
location = /uri =开头表示精确匹配,只有完全匹配上才能生效。
location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] }
location ^~ /uri ^~ 开头表示对URL路径进行前缀匹配,并且在正则之前。
location ~ pattern ~开头表示区分大小写的正则匹配。
location ~* pattern ~*开头表示不区分大小写的正则匹配。
location !~ /!~* pattern 区分大小写不匹配及不区分大小写不匹配的正则
location /uri 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。
location / 通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default。
执行顺序
多个location配置的情况下匹配顺序为首先匹配 =, 其次匹配 ^~(多个同时满足要求,遵循最大前缀匹配) ,其次是按文件中的顺序的正则匹配,最后是交给 / 通用匹配。 当匹配成功的时候,停止匹
配,按当前匹配规则处理请求。
两种情况下不需要继续匹配正则location:
第一种当普通location的前面指定了“^~”,特别告诉nginx本条普通location一旦匹配上,则不需要继续匹配。
第二种当普通location恰好严格匹配上,不是最大前缀匹配,则不再继续匹配正则
6.2 rewrite
语法 rewrite <regex> <replacement> [flag];
regex:perl兼容正则表达式语句进行规则匹配
replacement:将正则匹配的内容替换成replacement
flag标记:flag标记
原则
进行rewrite规则匹配,根据命中规则改写localtion,如果没有被其他指令中断并退出,则进入localtion匹配,执行匹配成功的localtion区块中的指令,rewrite只能放在server{},location{},if{}中,只能对域名后边的除去传递的参数外的字符串起作用
执行顺序
优先执行server块的rewrite指令
其次执行location匹配
然后执行选定的location中的rewrite指令
最后如果其中某步URI被重写,则重新循环执行,直到找到真实存在的文件;循环超过10次,则返回500 Internal
flag标志位
last – 本条规则匹配完成后,继续向下匹配新的location URI规则,中断当前的rewrite流程, 不再继续匹配后续的rewrite指令
break – 本条规则匹配完成即终止,不再匹配后面的任何规则,中断当前的rewrite流程, 不再继续匹配后续的rewrite指令
redirect – 返回临时重定向的HTTP状态302,会中断流程
permanent – 返回永久重定向的HTTP状态301,会中断流程
last与break的区别
相同点:
如果是在 server的顶级部分, 两者的作用相同, 跳过剩下的rewrite指令,进入localtion匹配,如果rewrite是在server区块顶级if内部, 和直接放在server下级的rewrite行为是一致的
不同点:
当rewrite指令存在于localtion区块时, last跳出localtion块, 重新进行后续的localtion匹配; 而break跳过localtion下的所有后续rewrite规则, 执行其他指令
location /error.html { rewrite /error.html /error.html break;<span> # 跳过后续的rewrite规则, 能正常显示error.html } location /success.html { rewrite /success.html /success.html last;<span> </span> # 重新进行localtion匹配, 无限循环, 服务器会出错 500 }
6.3 if条件判断
关系运算符
=,!=,~正则表达式匹配,~*不区分大小写的匹配,!~区分大小写的不匹配
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
6.4 upstream
声明一组可以被proxy_pass和fastcgi_pass引用的服务器,做分布式负载均衡
upstream statics{ server s10:80 weight=1; #访问配置了静态页面的nginx server s11:80 weight=1; #访问配置了静态页面的nginx server s12:80 weight=1; #访问配置了静态页面的nginx }
6.5 防盗链
//防盗链 location ~* \.(gif|jpg|png|swf|flv)$ { valid_referers none blocked www.baidu.com; if ($invalid_referer) { return 404; } }
valid_referers 使用none,blocked 或者正在表达式用来匹配referer,如果匹配到了就invalid_referer字段值为0(false), 否则设置该值为1(true),if ($invalid_referer)为true返回404
none 代表没有refere
blocked 代表有referer但是被防火墙或者是代理给去除了
6.6 常用$指令
$args : #这个变量等于请求行中的参数,同$query_string $content_length : 请求头中的Content-length字段。 $content_type : 请求头中的Content-Type字段。 $document_root : 当前请求在root指令中指定的值。 $host : 请求主机头字段,否则为服务器名称。 $http_user_agent : 客户端agent信息 $http_cookie : 客户端cookie信息 $limit_rate : 这个变量可以限制连接速率。 $status 请求状态 $body_bytes_sent 发送字节 $request_method : 客户端请求的动作,通常为GET或POST。 $remote_addr : 客户端的IP地址。 $remote_port : 客户端的端口。 $remote_user : 已经经过Auth Basic Module验证的用户名。 $request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。 $scheme : HTTP方法(如http,https)。 $server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。 $server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。 $server_name : 服务器名称。 $server_port : 请求到达服务器的端口号。 $request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。 $uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。 $document_uri : 与$uri相同。
6.7 proxy_set_header
语法:proxy_set_header header value;
该指令允许重新定义和添加一些将被转移到被代理服务器的请求头部信息。
proxy_set_header Host $host; //对应访问的域名,客户端请求的host
proxy_set_header Host $host:$proxy_port; //客户端请求的域名+端口 proxy_set_header X-Real-IP $remote_addr; //客户端的真实ip,客户端自己的ip proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; //真实客户端的ip
#上述值可以在日志文件中查看相应的结果,$host对应$http_host 的值,可以在日志中设置$http_host查看
proxy_set_header X-Real-IP $remote_addr与proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for的区别
$proxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr两部分,他们之间用逗号分开。
例如:一个请求经过两台nginx,那么经过第一台后,$remote_addr有值,X-Forwarded-For为空,经过第二台后,$remote_addr为上一台的值,X-Forwarded-For为真实的值(最原始的值)
6.8 proxy_read_timeout
语法 proxy_read_timeout time;
这个指令设置Nginx与后端服务器建立连接后。等待后端服务器的响应时间
6.9 proxy_send_timeout
语法:roxy_send_timeout time;
该指令指定请求转移到后端服务器的超时时间。整个传输的要求时间不超过超时时间,但只有两次写操作之间。如果在此时间之后的后端服务器将不采取新的数据,然后nginx将关闭连接。
6.10 proxy_connect_timeout
语法:proxy_connect_timeout time;
该指令用来设置分配到后端服务器的连接超时时间。
6.11 proxy_buffers
语法: proxy_buffers the_number is_size;
该指令设置缓冲区的数目和大小,缺省情况下,一个缓冲区的大小和页面大小相同。
6.12 proxy_buffer_size
语法:proxy_buffer_size buffer_size;
代理缓冲区,该指令用于保存用用户的头部信息。
6.13 proxy_busy_buffers_size
语法:proxy_busy_buffers_size size;
用于当系统负载较大,缓冲区不够用时,可以申请更大的proxy_buffers
6.14 proxy_temp_file_write_size
语法:proxy_temp_file_write_size size;
用于指定缓存临时文件的大小
6.15 proxy_pass
语法 proxy_pass URL; 用于反向代理
反向代理概念
反向代理是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向
代理服务器。
简单的反向代理配置
server { listen 80; server_name 127.0.0.1:8080; location / { proxy_pass http://127.0.0.1:8080; } }
以上存在资源路径的问题
原因
路径问题
解决方法
location ~ .*\.(png|jpg|css|js)$ { proxy_pass http://192.168.1.128:8080; }
以上方法也可以做到动静分离的目的
7.负载均衡
简单的配置实例
upstream statics{ server s10:80 weight=1; #访问配置了静态页面的nginx server s11:80 weight=1; #访问配置了静态页面的nginx server s12:80 weight=1; #访问配置了静态页面的nginx }
.... location ~* \.(png|html|js|css)$ { proxy_pass http://statics; } ....
负载均衡5种配置方式
轮询:上述假如没有指定weight ,那么默认采用的是轮询的方式;
weight 权重:表示轮询几率,与数值成正比
ip_hash: 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,但是服务器断开以后,还是会出现session问题,也就是说默认个服务器之间的session不是共享的,所以对于session共享并不可行
upstream statics{ ip_hash; server s10:80 weight=1; #访问配置了静态页面的nginx server s11:80 weight=1; #访问配置了静态页面的nginx server s12:80 weight=1; #访问配置了静态页面的nginx }
fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream statics{ fair; server s10:80 weight=1; #访问配置了静态页面的nginx server s11:80 weight=1; #访问配置了静态页面的nginx server s12:80 weight=1; #访问配置了静态页面的nginx }
url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效(根据hash算法)。
备注:session共享对nginx来说是不可靠的,有方法能解决session共享的问题,但是会对每台服务器占用一个线程去实现数据同步,因为大量的占用性能所以并不能去真正的应用于实践,一般采用cas单点登录去解决这个问题。