目录
正向代理:
在服务器端想要获取客户端信息时保护客户端,暴露的是代理服务器的地址,隐藏了真实的客户端的地址。

反向代理:
在客户端想要获取服务器端信息时保护服务端,暴露的是代理服务器的地址,隐藏了真实的服务端地址。

Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,ip_hash。
默认平均轮询RA:

- #默认平均轮询RA
- #每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
- 简单配置
- upstream test {
- server localhost:8080;
- server localhost:8081;
- }
- server {
- listen 81;
- server_name localhost;
- client_max_body_size 1024M;
-
- location / {
- proxy_pass http://test;
- proxy_set_header Host $host:$server_port;
- }
- }
加权轮询:

- #加权轮询
- upstream test {
- server localhost:8080 weight=9;
- server localhost:8081 weight=1;
- }
IP_Hash图如下:
对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。

- #IP_HASH示例配置
- upstream test {
- ip_hash;
- server localhost:8080;
- server localhost:8081;
- }
Nginx可以对不同的文件做不同的缓存处理,配置灵活,并且支持FastCGI_Cache,主要用于对FastCGI的动态程序进行缓存。配合着第三方的ngx_cache_purge,对制定的URL缓存内容可以的进行增删管理。
Nginx提供的动静分离是指把动态请求和静态请求分离开,合适的服务器处理相应的请求,使整个服务器系统的性能、效率更高。Nginx可以根据配置对不同的请求做不同转发,这是动态分离的基础。静态请求对应的静态资源可以直接放在Nginx上做缓冲,更好的做法是放在相应的缓冲服务器上。动态请求由相应的后端服务器处理。
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
- #url_hash示例配置
- upstream backend {
- hash $request_uri;
- hash_method crc32;
- server localhost:8080;
- server localhost:8081;
- }
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
- #fair示例配置
- upstream backend {
- fair;
- server localhost:8080;
- server localhost:8081;
- }
nginx下载地址:nginx: download
- yum install gcc pcre-devel openssl-devel -y #安装基础编译环境
- useradd nginx #创建nginx用户
- tar -xvf nginx-1.16.1.tar.gz #解压
- cd nginx-1.16.1
-
- #--prefix为指定安装目录,--user为指定账户名称,--group为指定组名称,--with-http_ssl_module为支持加密功能
- #--with-stream为TCP/UDP代理功能的模块,使用Nginx四层代理的时候会用到,--with-http_stub_status_module为开启status状态功能,可以查看nginx连接数等信息
- ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-stream --with-http_stub_status_module
-
- make && make install #编译安装
安装完成会在/usr/local下生成nginx文件,其中:
/usr/local/nginx #安装目录
conf/nginx.conf #主配置文件
html #网页目录
logs #日志文件
sbin/nginx #服务启动可执行文件
启动nginx服务:
/usr/local/nginx/sbin/nginx
常用选项:
-V :查看编译参数
-c :指定配置文件,启动服务
-t :测试配置文件语法是否有错误
web访问测试,默认80端口,直接浏览器访问ip即可:

关闭nginx:
/usr/local/nginx/sbin/nginx -s stop
重新加载配置:
/usr/local/nginx/sbin/nginx -s reload
- tar -xvf nginx-1.18.0.tar.gz #下载并解压更高版本nginx
-
- cd nginx-1.18.0
-
- ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module
-
- make #不要make install
-
- mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
-
- cp objs/nginx /usr/local/nginx/sbin/
-
- make upgrade #杀死老版本nginx进程,启动新版本nginx,如果报错也可以手动启动nginx
验证升级后版本:
/usr/local/nginx/sbin/nginx -V

主配置文件路径:/usr/local/nginx/conf/nginx.conf
- #user nobody;
- worker_processes 1; #启动几个进程,默认是1个进程
-
- #error_log logs/error.log; #日志存放位置
- #error_log logs/error.log notice;
- #error_log logs/error.log info;
-
- #pid logs/nginx.pid;
-
-
- events {
- worker_connections 1024; #nginx并发量,默认1024
- }
-
-
- 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;
-
- #gzip on;
-
- server {
- listen 80; #监听端口
- server_name localhost; #域名
-
- #charset koi8-r;
-
- #access_log logs/host.access.log main;
-
- location / {
- root html; #网站根路径,默认html,是相对路径,即/usr/local/nginx/html
- index index.html index.htm; #网站默认首页
- }
-
- #error_page 404 /404.html;
-
- # 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$ {
- # 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;
- #}
- }
-
-
- # 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;
-
- # location / {
- # root html;
- # index index.html index.htm;
- # }
- #}
-
- }
设置需要输入用户名密码,才能访问网站,修改主配置文件:
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
auth_basic "auth-domain"; #密码框提示信息,会显示auth-domain
auth_basic_user_file /usr/local/nginx/pass; #定义用户名和密码存放文件
......
}
- yum -y install httpd-tools
- htpasswd -c /usr/local/nginx/pass admin #创建认证用户admin,用户名可自定义,回车输入密码,-c为create的意思
-
- htpasswd /usr/local/nginx/pass admin2 #也可追加认证用户admin2,注意追加没有-c,如果有-c会覆盖之前的用户
密码为加密存储 :

/usr/local/nginx/sbin/nginx -s reload #reload重新加载配置文件
web访问:

虚拟主机可以实现一个nginx提供多个网站的访问
(1)基于域名的虚拟主机
server {
listen 80;
server_name web1.tedu.cn; #域名1
... ...
}
server {
listen 80;
server_name web2.tedu.cn; #域名2
... ...
}
(2)基于端口的虚拟主机
server {
listen 8080; #端口
server_name web1.tedu.cn; #域名
... ...
}
server {
listen 8000; #端口
server_name web1.tedu.cn; #域名
... ...
}
(3)基于IP的虚拟主机(服务器有多个网卡和IP时)
server {
listen 192.168.1.212:80; #端口
server_name web1.tedu.cn; #域名
... ...
}
server {
listen 192.168.1.213:80; #端口
server_name web1.tedu.cn; #域名
... ...
}
以基于域名的虚拟主机为例演示:
修改和添加2个server配置:
- server {
- listen 80;
- server_name web1.tedu.cn;
-
- #charset koi8-r;
-
- #access_log logs/host.access.log main;
-
- location / {
- root html;
- index index.html index.htm;
- }
- ... ...
- }
-
-
- server {
- listen 80;
- server_name web2.tedu.cn;
-
- location / {
- root web; #修改根目录为web,以便展示效果,不然还是访问的html相同内容
- index index.html index.htm;
- }
- }
如上图需在/usr/local/nginx下手动创建一个web目录,并拷贝一个index.html首页过去,自定义修改下内容。
/usr/local/nginx/sbin/nginx -s reload #重新加载配置
客户端测试:如果windows浏览器远程访问,由于没配dns,可以手动加一下hosts文件进行域名解析:
文件路径 C:\Windows\System32\drivers\etc\hosts

web访问测试:


... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
【释义】:
- ########### 每个指令必须有分号结束。#################
-
- #
- #user nobody; #设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的一些权限,示例:#user administrator administrators; #配置用户或者组,默认为nobody nobody
- worker_processes 1; #worker进程工作数设置,一般来说CPU有几个,就设置几个,或者设置为N-1也行
-
-
- #error日志设置,语法:error_log /path/file level; 当path/file 的值为 /dev/null时,这样就不会输出任何日志了,这也是关闭error日志的唯一手段
- #leve的取值范围是debug、info、notice、warn、error、crit、alert、emerg从左至右级别依次增大
- #如果设定的日志级别是debug,则会输出所有的日志,这一数据量会很大,需要预先确保/path/file所在的磁盘有足够的磁盘空间。级别设定到debug,必须在configure时加入 --with-debug配置项
- #error_log logs/error.log;
- #error_log logs/error.log notice;
- #error_log logs/error.log info;
-
- #pid logs/nginx.pid; #设置nginx进程 pid,pid文件(master进程ID的pid文件存放路径)的路径
-
-
- events { #events,设置工作模式,默认使用epoll
- #仅对指定的客户端输出debug级别的日志: 语法:debug_connection[IP|CIDR]
- #这个设置项实际上属于事件类配置,因此必须放在events{……}中才会生效。它的值可以是IP地址或者是CIRD地址。
- #debug_connection 10.224.66.14; #或是debug_connection 10.224.57.0/24
- #这样,仅仅以上IP地址的请求才会输出debug级别的日志,其他请求仍然沿用error_log中配置的日志级别。
- #注意:在使用debug_connection前,需确保在执行configure时已经加入了--with-debug参数,否则不会生效。
-
- worker_connections 1024; #每个worker允许连接的客户端最大连接数
- }
-
-
- http { #http 是指令块,针对http网络传输的一些指令配置
- include mime.types; #include 引入外部配置,提高可读性,避免单个配置文件过大
- default_type application/octet-stream;
-
- #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' #设定日志格式,main为定义的格式名称,如此 access_log 就可以直接使用这个变量了,详细参数名,见下方表格
- # '$status $body_bytes_sent "$http_referer" '
- # '"$http_user_agent" "$http_x_forwarded_for"';
-
- #access_log logs/access.log main;
-
- sendfile on; #sendfile使用高效文件传输,提升传输性能。启用后才能使用tcp_nopush,是指当数据表累积一定大小后才发送,提高了效率
- #tcp_nopush on;
-
- #keepalive_timeout 0; #keepalive_timeout设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗
- keepalive_timeout 65;
-
- #gzip on; #gzip启用压缩,html/js/css压缩后传输会更快
-
- server { #server可以在http指令块中设置多个虚拟主机,一个server块是一个虚拟主机
- listen 80; #监听端口
- server_name localhost; #域名、监听地址,其后可以跟多个主机名称
-
- #charset koi8-r;
-
- #access_log logs/host.access.log main;
-
- location / { #请求路由映射,匹配拦截,
- root html; #网页根目录
- index index.html index.htm; #首页位置
- #proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
- #deny 127.0.0.1; #拒绝的ip
- #allow 172.18.5.54; #允许的ip
- }
-
-
- #upstream mysvr {
- # server 127.0.0.1:7878;
- # server 192.168.10.121:3333 backup; #热备
- #}
-
- #error_page 404 /404.html; #404错误页面,可以自定义成:error_page 404 https://www.baidu.com;
-
- # 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$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写
- # 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;
- #}
- }
-
-
- # 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;
-
- # location / {
- # root html;
- # index index.html index.htm;
- # }
- #}
-
- }
