介绍nginx一般用法

  • nginx安装配置
  • 正向代理
  • 反向代理、负载均衡

一、安装配置

1.1 下载安装

官方下载包列表

我们示例中选择版本nginx-1.12.2.tar.gz

#下载到这个目录
cd /usr/local/software
wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar -zxvf nginx-1.12.2.tar.gz
#安装必要的开发工具
yum group install -y "Development Tools"
yum install gcc gcc-c++ ncurses-devel perl
yum install -y patch pcre-devel pcre zlib-devel zlib gzip
#安装到这个目录
./configure --prefix=/usr/local/nginx
make & make install

1.2 常用操作

#进入安装目录下的sbin目录
cd /usr/local/nginx/sbin
#启动
./nginx
#检查 nginx.conf配置文件是否有语法错误
./nginx -t
#重启
./nginx -s reload
#停止
./nginx -s stop

1.3 添加虚拟主机

cd /usr/local/nginx
vim ./conf/nginx.conf

#http节点下面添加server节点
server{
      listen 7777;
      server_name localhost;
      location / {
          root test;
          index index.html;
      }
    }

#在nginx根目录下面创建test目录,并添加index.html静态页面文件

#重新加载配置
./sbin/nginx -s reload

#访问localhost:7777

1.4 日志配置

cd /usr/local/nginx
vim ./conf/nginx.conf

#全局访问日志
#http>新增access_log、log_format配置
#单独指定某一个虚拟主机日志
#http>server>新增access_log、log_format配置

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;

#访问虚拟主机之后可以通过tail命令查看日志中输出的访问日志
tail -f ./logs/access.log

日志按照时间分割:

通过自定义shell脚本+crontab定时备份日志到新文件中

#!/bin/bash

#示例shell脚本名称为nginx_log.sh

#设置日志文件存放目录
LOG_HOME="/usr/local/nginx/logs/"
#备分文件名称,本示例按照分钟来分割文件
LOG_PATH_BAK="$(date -d yesterday +%Y%m%d%H%M)".test.access.log
#重命名日志文件
mv ${LOG_HOME}/test.access.log ${LOG_HOME}/${LOG_PATH_BAK}
#向nginx主进程发信号重新打开日志
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

执行crontab定时执行nginx_log.sh

crontab -e

#一分钟执行一次
*/1 * * * *  sh /usr/local/nginx/nginx_log.sh

二、正向代理

2.1 普通http代理

内–>外,举例子,通常无法访问google,我们找一台能够访问goole的机器,在上面搭一个nginx代理,把这个代理当做跳板,内网就可以访问google了

nginx代理配置

# 在http节点下添加代理server节点
server {
    # 配置DNS解析IP地址,比如 Google Public DNS,以及超时时间(5秒)
    #resolver必须,填DNS地址
    resolver 114.114.114.114;
    resolver_timeout 5s;

    # 监听端口
    listen 8080;

    access_log  /home/reistlin/logs/proxy.access.log;
    error_log   /home/reistlin/logs/proxy.error.log;

    location / {
        # 配置正向代理参数
        proxy_pass $scheme://$host$request_uri;
        # 解决如果URL中带"."后Nginx 503错误
        proxy_set_header Host $http_host;
        # 配置缓存大小
        proxy_buffers 256 4k;
        # 关闭磁盘缓存读写减少I/O
        proxy_max_temp_file_size 0;
         # 代理连接超时时间
        proxy_connect_timeout 30;
        # 配置代理服务器HTTP状态缓存时间
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 301 1h;
        proxy_cache_valid any 1m;
    }

}
  • windows客户端浏览器添加代理的方式

打开IE>设置>Internet选项>连接>局域网设置>添加代理服务器

  • linux客户端添加代理的方式
#一次性代理,直接在shell执行
export http_proxy=http://192.168.1.9:8080
#永久使用
vim /etc/profile
export http_proxy=http://192.168.1.9:8080
source /etc/profile
#yum源配置:
vim /etc/yum.conf
proxy=http://192.168.1.9:8080
#通过curl指定代理来直接测试代理是否生效
curl -x 192.168.1.9:8080 -I http://xxxx.xxxx.xxxx/xxx.xxx

2.2 同时支持http、https

默认情况下nginx自身无法代理https请求,按照上面的步骤配置之后,客户端只能访问http网页,无法访问https的

安装ngx_http_proxy_connect_module模块

通过额外的ngx_http_proxy_connect_module模块,可以让nginx正向代理同时支持http、https,但是这个模块的安装必须要重装nginx,因为涉及到nginx内核修改,所以如果需要使用nginx来做正向代理功能且支持https,安装时必须把这个模块考虑进去

停掉nginx服务,进入最一开始下载的源码目录下,重新安装

#首先下载ngx_http_proxy_connect_module
cd /usr/local/software
git clone https://github.com/chobits/ngx_http_proxy_connect_module.git

#安装模块到nginx中,然后重新安装nginx
cd /usr/local/software/nginx-1.12.2
patch -p1 < ../ngx_http_proxy_connect_module/patch/proxy_connect.patch
./configure --add-module=../ngx_http_proxy_connect_module --prefix=/usr/local/nginx
make && make install

注意版本的对应关系,nginx-1.12.2版本对应的是proxy_connect.patch这个模块文件

配置支持http、https

#支持https的正向代理配置
server {
    resolver 114.114.114.114;
    resolver_timeout 5s;
    listen       8889;
    proxy_connect;
    proxy_connect_allow            443 563;
    proxy_connect_connect_timeout  10s;
    proxy_connect_read_timeout     10s;
    proxy_connect_send_timeout     10s;

    access_log logs/https.log main;

    location / {
        proxy_pass http://$host;
        proxy_set_header Host $host;
        proxy_buffers 256 4k;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout 30;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 301 1h;
        proxy_cache_valid any 1m;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

客户端配置代理服务器,访问外网,服务端监视一下访问日志

cd cd /usr/local/nginx/logs
tail -f https.log

三、反向代理、负载均衡

外–>内,举例子,内网搭了一个web集群站点,现在想让外部人来访问这个站点,为了支持负载,可以配置一个nginx服务器,外部请求通过这个nginx服务器转发到后端的web站点

nginx配置

#在http节点下配置反向代理服务
#weigth参数表示权值,权值越高被分配到的几率越大
upstream hello{
    server 192.168.237.129:8080 weight=1;
    server 192.168.237.129:8080 weight=1;
}
server {
    #侦听的80端口
    listen       9999;
    server_name  localhost;
    location / {
        #在这里设置一个代理,和upstream的名字一样
        proxy_pass   http://hello;
        #以下是一些反向代理的配置可删除
        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;
        #nginx跟后端服务器连接超时时间(代理连接超时)
        proxy_connect_timeout      300;
        #后端服务器数据回传时间(代理发送超时)
        proxy_send_timeout         300;
        #连接成功后,后端服务器响应时间(代理接收超时)
        proxy_read_timeout         300;
        #设置代理服务器(nginx)保存用户头信息的缓冲区大小
        proxy_buffer_size          4k;
        #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
        proxy_buffers              4 32k;
        #高负荷下缓冲大小(proxy_buffers*2)
        proxy_busy_buffers_size    64k;
        #设定缓存文件夹大小,大于这个值,将从upstream服务器传
        proxy_temp_file_write_size 64k;
    }
}

一个完整的nginx.conf配置

worker_processes  1;

events {
    worker_connections  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;
    keepalive_timeout  65;

    #1. 默认80端口的静态页面虚拟主机
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    #2. 自定义7777端口的静态页面虚拟主机
    server{
      listen 7777;
      server_name localhost;
      location / {
          root test;
          index index.html;
      }
      access_log logs/test.access.log main;

    }

    #3. 正向代理配置
    server {
        resolver 114.114.114.114;
        resolver_timeout 10s;

        listen 443;

        access_log logs/forward_proxy.log main;
        error_log logs/forward_proxy_error.log;

        location / {
            proxy_pass https://$host$request_uri;
            proxy_set_header Host $http_host;
            proxy_buffers 256 4k;
            proxy_max_temp_file_size 0;
            proxy_connect_timeout 30;
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 301 1h;
            proxy_cache_valid any 1m;

        }
    }

    #3.1 正向代理支持https
    server {
        resolver 114.114.114.114;
        resolver_timeout 5s;
        listen       8889;
        proxy_connect;
        proxy_connect_allow            443 563;
        proxy_connect_connect_timeout  10s;
        proxy_connect_read_timeout     10s;
        proxy_connect_send_timeout     10s;

        access_log logs/https.log main;

        location / {
          #proxy_pass $scheme://$host$request_uri;
          #proxy_set_header Host $http_host;

          proxy_pass http://$host;
          proxy_set_header Host $host;


          proxy_buffers 256 4k;
          proxy_max_temp_file_size 0;

          proxy_connect_timeout 30;

          proxy_cache_valid 200 302 10m;
          proxy_cache_valid 301 1h;
          proxy_cache_valid any 1m;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

    #4. 反向代理
    #weigth参数表示权值,权值越高被分配到的几率越大
    upstream hello{
        server 192.168.237.129:8080 weight=1;
        server 192.168.237.129:8080 weight=1; 
    }
    server {
        #侦听的80端口
        listen       9999;
        server_name  localhost;
        location / {
            #在这里设置一个代理,和upstream的名字一样
            proxy_pass   http://hello;
            #以下是一些反向代理的配置可删除
            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;
            #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_connect_timeout      300;
            #后端服务器数据回传时间(代理发送超时)
            proxy_send_timeout         300;
            #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_read_timeout         300;
            #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffer_size          4k;
            #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
            proxy_buffers              4 32k;
            #高负荷下缓冲大小(proxy_buffers*2)
            proxy_busy_buffers_size    64k;
            #设定缓存文件夹大小,大于这个值,将从upstream服务器传
            proxy_temp_file_write_size 64k;
        }
    }
}

参考

Nginx教程

nginx做正向代理(Centos7,支持http和https)