一、正向代理与反向代理
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器;
隐藏了真正的服务端,作为用户只知道这个代理服务器,它会把我们的请求转发到真实为我们服务的那台服务器那里去。
正向代理类似一个跳板机,代理访问外部资源。比如:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器,它能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。
代理客户端去请求服务器,隐藏了真实客户端,服务器并不知道真实的客户端是谁。实际场景:科学上网。
总结:正向代理代理对象是客户端,反向代理代理对象是服务端。
Nginx应用场景:软件层面一般常用Nginx来做反向代理服务器,它的性能非常好,用来做负载均衡。
个人理解:
正向代理:类似于一个跳板机,对应的代理服务器去帮我们访问资源再返回给我们。 反向代理:以代理服务器来接收网络请求,接着请求转发给内部的服务器接收到请求之后再响应给用户,此时对外表现为反向服务器。
二、启动方式与组成结构
启动方式
普通启动:切换到sbin目录下,直接执行./nginx。
指定配置文件启动:nginx -c /usr/local/nginx/conf/nginx.conf,-c表示指定后者路径必须为绝对路径。
ps:Nginx启动后,安装目录下会出现一些_tmp结尾的文件,这些是临时文件。
体系结构
nginx 体系结构:由 master 进程和其 worker 进程组成。master 进程读取配置文件,并维护 worker 进程,而 worker 进程则对请求进行实际处理。
个人理解:
在nginx中包含master以及worker进程,master进程主要负责读取配置文件以及维护worker进程,worker进程则是真正处理请求。
三、Nginx配置文件
配置文件(三个部分)
参考:Nginx配置使用详解
Nginx的核心配置文件主要由三个部分构成:基础配置、exents配置、http配置。
基础配置
# 配置worker进程运行的用户 nobody也是一个linux用户,一般用于启动程序,无密码 #user nobody; # 配置工作进程的数目,可以进行调整,一般是CPU数量或者对应两倍数量 worker_processes 1; # 全局错误日志配置,之后各个模块的错误日志可以在这里看,默认是errror #error_log logs/error.log; #error_log logs/error.log notice; error_log /var/log/nginx/error.log warn; # 配置的进程pid文件,在这个文件里可以找到nginx的进程号 pid /var/run/nginx.pid;
events配置
# 事件配置 events { # 每个worker连接数上限 worker_connections 1024; }
Http配置
(1)基本配置
# 配置HTTP服务器,利用这个服务器的反向代理功能提供负载均衡支持 http { # 配置nginx支持哪些多媒体类型,在/etc/nginx/mime.types中你可以看到所有支持的类型 include /etc/nginx/mime.types; # 默认我们使用的多媒体类型,这里就表示全部类型(指任意类型的二进制流数据) default_type application/octet-stream; # 表示我们日志的一个打印格式:地址、用户、请求、状态、请求体数量、referer来源、用户身份 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中记录了所有请求的打印信息(err.log只记录报错信息) access_log /var/log/nginx/access.log main; # 开启高效文件传输模式 sendfile on; # 防止网络阻塞 #tcp_nopush on; # 长连接超时时间,单位是秒 keepalive_timeout 65; # 开启gzip压缩,所有文件进行压缩,但是到客户端会有一个解压的过程 #gzip on; include /etc/nginx/conf.d/*.conf; }
关于access.log文件随着请求数量增多以及时间增长就会特别的问题:access.log日志记录与关闭
# 采取方式 # ①定时脚本: * 1 * * * echo "" > /home/wwwlog/access.log #每日凌晨1点清空日志 # ②关闭日志记录,access.log可以关,但是error.log必须开启。注销掉access.log接着手动配置关闭 # access_log /var/log/nginx/access.log main; access_log off;
(2)server配置,可以配置多个
nginx.conf: # 在redis.conf中你可看到一个包含语法,这就表示我们可以自己去配置一下server来让nginx进行代理 include /etc/nginx/conf.d/*.conf; 1 2 xxx.conf:注意每一行要分号结尾 # 配置虚拟主机 server { # 配置监听的端口 listen 80; # 配置的服务名 server_name localhost; # 配置字符集 #charset koi8-r; # 配置本虚拟主机的访问日志 #access_log /var/log/nginx/log/host.access.log main; # 匹配/的请求,若是匹配到就会进行处理 location / { # 配置服务器默认网站的根目录位置,默认是nginx安装目录下的html文件目录 root /usr/share/nginx/html; # 首页访问的地址,可以是.html或.htm结尾 index index.html index.htm; } # 404跳转页面的配置 #error_page 404 /404.html; # 重定向配置 # redirect server error pages to the static page /50x.html # # # 错误页的配置 error_page 500 502 503 504 /50x.html; # 精确匹配:匹配/50x.html的url进行跳转路径,与我们之气匹配的/也是一致的 location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # 设置代理服务器的地址,可以是主机名称,IP地址加端口号等形式 # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # 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; #} }
1、关于root与alias指令
参考文章:nginx的root 指令
一般在默认的default.conf中在location下是root,表示根目录的意思: location / { root /usr/share/nginx/html; index index.html index.htm; }
其中root指令可以使用alias指令来进行交换,效果都是说指定目录中找文件资源。
实际应用区别:只有在/xxx/这种情况才会体现出来
# 访问/img/,ningx会自动去/var/www/image/目录找文件 location /img/ { alias /var/www/image/; } # 访问/img/,ningx会自动去/var/www/image/img/目录找文件 location /img/ { root /var/www/image; }
alias是一个目录别名的定义,root则是最上层目录的定义。
注意点:
1、在一个location中,alias可以存在多个,但是root只能有一个。
2、alias只能存在与location中,但是root可以用在server、http和location中。
3、alias后面值必须要“/”结束,否则会找不到文件,而root的“/”可有可无。
坑点:若是访问自己的本地静态资源最好就是在对应server listen:80下来写匹配location,不要自己重新另外编写server 监听其他端口来访问本地路径!!!
2、关于代理参数
# 负载均衡必加:作用是将原http请求的Header中的Host字段放到转发的请求里。若是不加这行nginx转发请求中就不会有Host字段,而服务器根据Host来区分你请求的哪个域名资源 proxy_set_header Host $host; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $remote_addr;
地路径!!!
2、关于代理参数
# 负载均衡必加:作用是将原http请求的Header中的Host字段放到转发的请求里。若是不加这行nginx转发请求中就不会有Host字段,而服务器根据Host来区分你请求的哪个域名资源 proxy_set_header Host $host; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $remote_addr;