Nginx概念,代理与反代理

1.Nginx是什么?

是一个服务器。
由俄罗斯的程序设计师Igor Sysoev所开发。
是一个高性能的HTTP服务器。
是一个反向代理服务器。
也是一个 IMAP/POP3/SMTP 代理服务器。
在高连接并发的情况下,Nginx是Apache服务器不错的替代品。


2.Nginx的特点?

轻量级。
事件驱动编写。
高性能。
占有内存少。
并发能力强。
模块化结构。
高稳定性。
支持热部署。
多进程模式。

参考jike

3.Nginx的应用场景?

中国大陆使用nginx网站用户有:百度、京东新浪网易腾讯淘宝等。

4.Nginx的安装?

http://www.runoob.com/linux/nginx-install-setup.html

5.Nginx的基本配置?

配置文件 nginx.conf

5.1指令概述

配置指令是一个字符串,可以用单引号或者双引号括起来,也可以不括。但是如果配置指令包含空格,一定要引起来。

5.2指令参数

指令的参数使用一个或者多个空格或者 TAB 字符与指令分开。指令的参数有一个或者多个 TOKEN 串组成。TOKEN 串之间由空格或者 TAB 键分隔。

5.3指令上下文

nginx.conf 中的配置信息,根据其逻辑上的意义,对它们进行了分类,也就是分成了多个作用域,或者称之为配置指令上下文。不同的作用域含有一个或者多个配置项。
当前 Nginx 支持的几个指令上下文:

  • main: Nginx 在运行时与具体业务功能(比如http服务或者email服务代理)无关的一些参数,比如工作进程数,运行的身份等。
  • http: 与提供 http 服务相关的一些配置参数。例如:是否使用 keepalive 啊,是否使用gzip进行压缩等。
  • server: http 服务上支持若干虚拟主机。每个虚拟主机一个对应的 server 配置项,配置项里面包含该虚拟主机相关的配置。在提供 mail 服务的代理时,也可以建立若干 server,每个 server 通过监听的地址来区分。
  • location: http 服务中,某些特定的URL对应的一系列配置项。
  • mail: 实现 email 相关的 SMTP/IMAP/POP3 代理时,共享的一些配置项(因为可能实现多个代理,工作在多个监听地址上)。

main: user、worker_processes、error_log、events、http、mail
http : server
mail :server、auth_http、imap_capabilities
server:listen、server_name、access_log、location、protocol、proxy、smtp_auth、xclient
location:index、root

6.Nginx的基本语句?

/usr/local/nginx/sbin/nginx # 启动Nginx
/usr/local/nginx/sbin/nginx -t # 测试配置文件是否有错误
/usr/local/nginx/sbin/nginx -v # 查看Nginx版本
/usr/local/nginx/sbin/nginx -V # 查看Nginx版本和编译安装时的编译参数
/usr/local/nginx/sbin/nginx -s stop # 强制停止Nginx服务
/usr/local/nginx/sbin/nginx -s quit # 优雅地停止Nginx服务(即处理完所有请求后再停止服务)
/usr/local/nginx/sbin/nginx -s reload # 重新加载Nginx配置文件,然后以优雅的方式重启Nginx

1、启动nginx服务时先检查nginx.conf配置文件是否正确
  # /home/weixin/local/nginx/sbin/nginx -t
2、确定80端口没有被占用

参考:
Nginx入门指南
Nginx架构详解


代理与反向代理

概念

https://www.cnblogs.com/Anker/p/6056540.html

关键参数

server_name
location
proxy_set_header Host
proxy_set_header Host host; proxy_set_header X-Forwarded-Protoscheme;
proxy_set_header X-Real-IP remote_addr; proxy_set_header X-Forwarded-Forproxy_add_x_forwarded_for;
proxy_pass http://online;

proxy_set_header用来重定义发往后端服务器的请求头。

  • proxy_set_header Host proxy_host; 当Host设置为proxy_host时,则会重新设置请求头为bbb.example.com的Host信息。
  • proxy_set_header Host $http_host; 不改变请求头的值
    当要转发到bbb.example.com的时候,请求头还是aaa.example.com的Host信息,就会有问题

nginx为了实现反向代理的需求而增加了一个ngx_http_proxy_module模块。其中proxy_set_header指令就是该模块需要读取的配置文件。在这里,所有设置的值的含义和http请求同中的含义完全相同,除了Host外还有X-Forward-For。

Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而如果后端真是的服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败【默认反向代理服务器会向后端真实服务器发送请求,并且请求头中的host字段应为proxy_pass指令设置的服务器】。

同理,X_Forward_For字段表示该条http请求是有谁发起的?如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来在反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。因此,在配置用作反向代理的nginx中一般会增加两条配置,修改http的请求头:
proxy_set_header Host http_host; proxy_set_header X-Forward-Forremote_addr;

这里的http_host和remote_addr都是nginx的导出变量,可以再配置文件中直接使用。如果Host请求头部没有出现在请求头中,则http_host值为空,但是host值为主域名。因此,一般而言,会用host代替http_host变量,从而避免http请求中丢失Host头部的情况下Host不被重写的失误。

语法格式:
proxy_set_header Field Value;

Value值可以是包含文本、变量或者它们的组合。常见的设置如:

proxy_set_header Host $proxy_host;   // 重新设置请求头为proxy_pass定义的地址
proxy_set_header X-Real-IP $remote_addr;   // 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $remote_addr;

注意:在nginx的配置文件中,如果当前模块中没有proxy_set_header的设置,则会从上级别继承配置。继承顺序为:http, server, location。


本机操作记录

nginx文件路径:/usr/local/etc/nginx/nginx.conf

遇到http强制跳转成https的问题。监听443端口,添加仿制证书

listen 80;
listen 443 ssl;
ssl_certificate  /usr/local/etc/nginx/server.crt;
ssl_certificate_key  /usr/local/etc/nginx/server_nopwd.key;
mac下nginx操作命令
启动:ps -ef|grep nginx  
停止
ps -ef|grep nginx  
kill -QUIT 15800


1、Mac下Nginx的启动:
cd /usr/local/etc/nginx 
sudo nginx

2、Mac下判断配置文件是否正确
cd  /usr/local/nginx/sbin  
sudo nginx -t

3、Mac下重启Nginx
cd /usr/local/nginx/sbin  
sudo nginx -s reload
4、Mac下Nginx的关闭
查询nginx主进程号:ps -ef|grep nginx
正常停止   sudo kill -QUIT 主进程号  
快速停止   sudo kill -TERM 主进程号
hosts文件操作命令
sudo vi /private/etc/hosts   进入
i    编辑 
esc  退出编辑
:w   保存
:wq! 保存并退出

参数详解

#工作进程数,建议设置为CPU的总核数
worker_processes  16;

#全局错误日志定义类型,日志等级从低到高依次为:
#debug | info | notice | warn | error | crit
error_log  logs/error.log  info;

#记录主进程ID的文件
pid        /nginx-1.13.7/nginx.pid;  

#一个进程能打开的文件描述符最大值,理论上该值因该是最多能打开的文件数除以进程数。
#但是由于nginx负载并不是完全均衡的,所以这个值最好等于最多能打开的文件数。
#LINUX系统可以执行 sysctl -a | grep fs.file 可以看到linux文件描述符。
worker_rlimit_nofile 65535;
 
#连接数上限,单个进程允许的最大连接数
events {  
    worker_connections  65535;
}

#设定http服务器,利用它的反向代理功能提供负载均衡支持
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 记录了哪些用户,哪些页面以及用户浏览器、ip和其他的访问信息
    access_log  logs/access.log  main;
     
    #服务器名字的hash表大小
    server_names_hash_bucket_size 128;
     
    #客户端请求头缓冲大小。
    #nginx默认会用client_header_buffer_size这个buffer来读取header值,
    #如果header过大,它会使用large_client_header_buffers来读取。
    #如果设置过小HTTP头/Cookie过大 会报400 错误 nginx 400 bad request
    #如果超过buffer,就会报HTTP 414错误(URI Too Long)
    #nginx接受最长的HTTP头部大小必须比其中一个buffer大
    #否则就会报400的HTTP错误(Bad Request)
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
 
    #客户端请求体的大小
    client_body_buffer_size    8m;
 
    #隐藏ngnix版本号
    server_tokens off;
 
    #忽略不合法的请求头
    ignore_invalid_headers   on;
 
    #指定启用除第一条error_page指令以外其他的error_page。
    recursive_error_pages    on;
 
    #让 nginx 在处理自己内部重定向时不默认使用  server_name 设置中的第一个域名
    server_name_in_redirect off;
 
    #开启文件传输,一般应用都应设置为on;若是有下载的应用,则可以设置成off来平衡网络I/O和磁盘的I/O来降低系统负载
    sendfile  on;
 
    #告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送。
    tcp_nopush  on;
 
    #告诉nginx不要缓存数据,而是一段一段的发送--当需要及时发送数据时,就应该给应用设置这个属性,
    #这样发送一小块数据信息时就不能立即得到返回值。
    tcp_nodelay    on;
 
    #长连接超时时间,单位是秒
    keepalive_timeout  65;
 
    #gzip模块设置,使用 gzip 压缩可以降低网站带宽消耗,同时提升访问速度。
    gzip  on;                     #开启gzip
     
    gzip_min_length  1k;          #最小压缩大小
     
    gzip_buffers     4 16k;       #压缩缓冲区
 
    gzip_http_version 1.0;        #压缩版本
 
    gzip_comp_level 2;            #压缩等级
 
    gzip_types   text/plain text/css text/xml text/javascript application/json application/x-javascript application/xml application/xml+rss;          #压缩类型
 
    #upstream作负载均衡,在此配置需要轮询的服务器地址和端口号
    #max_fails为允许请求失败的次数,默认为1.
    #weight为轮询权重,根据不同的权重分配可以用来平衡服务器的访问率。
    #指定要域名对应的WEB项目访问地址
    upstream nginx.www.test.cn {
        server localhost:3000 max_fails=3 weight=1;
    }
    
    #主机配置
    server {
        #监听端口
        listen       90;
 
        #自己指定要跳转的域名
        server_name   192.168.1.19;
         
        #反向代理配置,
        #将所有请求为http://nginx.www.test.cn的请求全部转发到upstream中定义的目标服务器中。
        location / {
            #定义首页索引文件的名称
            #index index.php index.html index.htm;
 
            #此处配置的域名必须与upstream的域名一致,才能转发。
            proxy_pass     http://nginx.www.test.cn;
             
            #以下是一些反向代理的配置可删除
            proxy_redirect             off;
             
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header           Host $host;
            proxy_set_header           X-Real-IP $remote_addr;
            proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
             
            #client_max_body_size       10m;   #允许客户端请求的最大单文件字节数
            #client_body_buffer_size    128k;  #缓冲区代理缓冲用户端请求的最大字节数
            #proxy_connect_timeout      300;   #nginx跟后端服务器连接超时时间(代理连接超时)
            #proxy_send_timeout         300;   #后端服务器数据回传时间(代理发送超时)
            #proxy_read_timeout         300;   #连接成功后,后端服务器响应时间(代理接收超时)
            #proxy_buffer_size          4k;    #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            #proxy_buffers              4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
            #proxy_busy_buffers_size    64k;   #高负荷下缓冲大小(proxy_buffers*2)
            #proxy_temp_file_write_size 64k;   #设定缓存文件夹大小,大于这个值,将从upstream服务器传
        }
         
        #单独的access_log文件
        access_log  logs/192.168.1.19.access.log  main;
 
        #设定查看Nginx状态的地址
        location /NginxStatus{
             stub_status on;
             access_log on;
             auth_basic "NginxStatus";
             auth_basic_user_file htpasswd;
        }
                 
        #禁止访问 .htxxx 文件
        location ~ /\.ht {
            deny all;
        }
 
        #字符集
        charset utf-8;
         
        #错误页面
        error_page   500 502 503 504 /50x.html; 
            location = /50x.html {
            root   /root;
        }
    }
}

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 121,040评论 16 134
  • 1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单...
    rosekissyou阅读 9,004评论 5 125
  • 1月31日精进 今日体验: 今天是1月的最后一天 都在努力的干活 接车 我也一样 最后还是想多为这个月干点业绩 ...
    小璇_c390阅读 59评论 0 0
  • 传说鱼的记忆只有7秒, 七秒后便不记得 过往物事了,所以小小的鱼缸里 它也不觉得无聊, 因为7秒后 每一寸游过的地...
    亲爱的郭01阅读 323评论 0 0