配置:
conf/nginx.conf
##全局配置段
user nobody; #worker进程的用户,尽量不要用root
worker_processes 1; #worker进程数,不要大于cpu核数
error_log logs/error.log info; #错误日志及级别
##event配置段
events {
worker_connections 1024;
use epoll;
}
##http配置段
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server_tokens off; #隐藏版本
upstream tomcat {
server localhost:8080; #定义upstream server
}
#server配置段
server {
listen 80;
server_name 192.168.80.172;
location / {
proxy_pass http://tomcat/ppw/; #反向代理,有路径写在这里
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
后端服务器主备配置:
upstream test {
server 192.168.80.172:8080;
server 192.168.80.172:8081 backup;
}
注:没有相同域名的server主机,会找满足端口要求的第一个主机
访问控制:
可以放至 http,server,location等
allow 192.168.80.0/24;
deny all;
目录映射:
#全局配置
root html;
location / {
#proxy_pass http://test;
index index.html index.htm;
}
location /aa { #访问xxx.com/a -->html/aa/index.html
index index.html;
}
#分别配置:
location / {
#proxy_pass http://test;
root html;
index index.html index.htm;
}
location /bb {
root html/aa; #访问xxx.com/bb -->html/aa/bb/index.html,其实是将/bb加在root路径后面
index index.html;
}
反向代理:
upstream apiServer {
server 10.10.10.10:8888
...
}
server {
...
location /api {
proxy_pass http://apiServer;
proxy_cookie_domain apiServer a.test.com; #替换response set-cookie头中的domain属性
#语法:proxy_set_header field value;
#field :为要更改的项目,也可以理解为变量的名字,比如host
#value :为变量的值
proxy_set_header host $host; #默认值为$proxy_host,会修改header中host的字段为后端real server的ip,$host和$http_host相同,只能写一个,代表请求的原始host
proxy_set_header X-Real-IP $remote_addr; #"$http_x_real_ip",添加了这个变量的值
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #修改了$http_x_forwarded_for的值,为"$remote_addr,上一跳的ip"
#用来设置被代理端接收到的远程客户端IP,如果不设置,则header信息中并不会透传远程真实客户端的IP地址。
}
...
}
url的/问题
在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。
1.proxy_pass的目标地址,默认不带/,表示只代理域名,url和参数部分不会变(把请求的path拼接到proxy_pass目标域名之后作为代理的URL)
2.如果在目标地址后增加/,则表示把path中location匹配成功的部分剪切掉之后再拼接到proxy_pass目标地址
下面四种情况分别用http://192.168.1.4/proxy/test.html 进行访问。
第一种:
location /proxy/ {
proxy_pass http://127.0.0.1:81/;
}
会被代理到http://127.0.0.1:81/test.html 这个url
第二种(相对于第一种,最后少一个 /)
location /proxy/ {
proxy_pass http://127.0.0.1:81;
}
会被代理到http://127.0.0.1:81/proxy/test.html 这个url
第三种:
location /proxy/ {
proxy_pass http://127.0.0.1:81/ftlynx/;
}
会被代理到http://127.0.0.1:81/ftlynx/test.html 这个url。
第四种情况(相对于第三种,最后少一个 / ):
location /proxy/ {
proxy_pass http://127.0.0.1:81/ftlynx;
}
会被代理到http://127.0.0.1:81/ftlynxtest.html 这个url
nginx_upstream_check_module(nginx状态页面)安装:
1 unzip nginx_upstream_check_module-master.zip
2 进入 nginx 源码目录, 并用 patch 命令 对源文件打补丁
patch -p1 < /root/smb/software/nginx/nginx_upstream_check_module-master/check_1.16.1+.patch
3 编译nginx
./configure --prefix=./nginx --add-module=../nginx_upstream_check_module-master --with-http_ssl_module
下略
报错:OpenSSL library is not used
--with-http_ssl_module
4 配置nginx.conf
upstream test111 {
server 172.17.1.1;
server 172.17.3.164:8080;
check interval=2000 rise=2 fall=2 timeout=1000 type=http;
# check_http_send "HEAD / HTTP/1.0\r\n\r\n";
# check_http_expect_alive http_2xx http_3xx http_4xx;
}
--------
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://test111;
}
location /status {
check_status;
access_log off;
}
.....
rewrite:
例,重定向url,并反向代理至多台kibana
upstream kibanaServer {
ip_hash; #同一ip,负载均衡到固定的后端kibana
server 10.78.228.162:5601;
server 10.78.228.163:5601;
server 10.78.228.164:5601;
check interval=5000 rise=1 fall=3 timeout=4000;
}
server {
...
location ~ /elk {
rewrite ^/.* /kibana last;
}
location /kibana/ {
proxy_pass http://kibanaServer;
}
}
server_name:
nginx会解析http header里的host 找到匹配的server_name 如果没有则用默认的 或者第一个
例:禁止ip访问:
server {
listen 80;
server_name _;
return 404;
}
server {
listen 80;
server_name www.hello.com;
}
当用ip访问的时候 没有匹配的server 则会匹配到第一个server 返回404
文件服务器:
在nginx.conf的http{}上下文中,增加
autoindex on;# 显示目录
autoindex_exact_size on;# 显示文件大小
autoindex_localtime on;# 显示文件时间
指定路径:
location ~ /files {
access_log off;
#root /tmp;
alias /tmp/;
}
httpd 实现:在/etc/httpd/conf/httpd.conf中增加
<Directory "/home/wwwroot/rpms">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
python实现(单线程):
python3 -m http.server 88
增加登录验证:
location / {
proxy_pass http://127.0.0.1:5601$request_uri;
auth_basic "登录验证";
auth_basic_user_file /etc/nginx/htpasswd;
}
$request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。不能修改。
密码生成:
htpasswd -c -b /etc/nginx/htpasswd kibana kibana
-c:创建一个加密文件 -b:在命令行中一并输入用户名和密码而不是根据提示输入密码
密码采用 apr1 方式加密
注意修改密码文件权限:
chmod 600 htpasswd
chown nobody. htpasswd