Dec 18

1.安装编译环境

apt-get install build-essential git gcc g++ make

2.安装 lua

apt-get install liblua5.1-0-dev liblua50-dev liblualib50-dev

3.安装 luajit

wget http://luajit.org/download/LuaJIT-2.0.3.tar.gz
tar -zxvf LuaJIT-2.0.3.tar.gz
cd LuaJIT-2.0.3
make PREFIX=/usr/local
make install

4.下载 nginx
因为 lua-nginx-module 只支持 Lua 5.1 或者 LuaJIT 2.0/2.1 版本,nginx 目前最高支持 1.9.3版本,所以需要设置 http_spdy_module 模块,1.9.5版本以上就可以支持
http_v2_module 模块了。

wget "http://nginx.org/download/nginx-1.9.3.tar.gz"
wget "ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz"
wget "https://www.openssl.org/source/openssl-1.0.1j.tar.gz"
wget "http://zlib.net/zlib-1.2.8.tar.gz"

git clone https://github.com/cuber/ngx_http_google_filter_module
git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module
git clone https://github.com/openresty/lua-nginx-module.git
git clone https://github.com/simpl/ngx_devel_kit.git

tar xzvf nginx-1.9.3.tar.gz
tar xzvf pcre-8.38.tar.gz
tar xzvf openssl-1.0.1j.tar.gz
tar xzvf zlib-1.2.8.tar.gz

5.编译安装 nginx

./configure \
  --user=root \
  --group=root \
  --prefix=/usr/local/nginx \
  --with-pcre=../pcre-8.38 \
  --with-openssl=../openssl-1.0.1j \
  --with-zlib=../zlib-1.2.8 \
  --with-http_ssl_module \
  --with-http_stub_status_module \
  --with-http_ssl_module \
  --with-http_spdy_module \
  --with-http_gzip_static_module \
  --with-ipv6 \
  --with-http_sub_module \
  --add-module=../ngx_http_google_filter_module \
  --add-module=../ngx_http_substitutions_filter_module \
  --add-module=../ngx_devel_kit \
  --add-module=../lua-nginx-module

参考资料:https://github.com/openresty/lua-nginx-module/tree/master

6.编辑 nginx.conf

#user  nobody;
worker_processes  auto;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    use epoll;
    worker_connections 51200;
    multi_accept on;
}


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;
    tcp_nodelay on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 256k;

    gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types       text/plain application/x-javascript text/css application/xml;
    gzip_vary on;
    gzip_proxied        expired no-cache no-store private auth;
    gzip_disable        "MSIE [1-6]\.";

    server {
        listen       80;
        server_name  scholar.xxx.com;
        rewrite ^(.*) https://scholar.xxx.com$1 permanent;
           }

    server {
        listen 443 spdy;
        server_name scholar.xxx.com;

        ssl on;
        ssl_certificate /usr/local/nginx/conf/xxx.crt;
        ssl_certificate_key /usr/local/nginx/conf/xxx.key;
        ssl_dhparam /usr/local/nginx/conf/dhparam2048.pem;
        add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !aNULL !eNULL !LOW !MD5 !EXP !DSS !PSK !SRP !kECDH !CAMELLIA !RC4 !SEED';
        ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
        ssl_session_cache   shared:SSL:10m;
        ssl_session_timeout 10m;
        keepalive_timeout   70;
        ssl_buffer_size 1400;
        spdy_headers_comp 0;

        resolver 8.8.8.8;
        location / {
            set $upstream "";
            rewrite_by_lua '
                 local upstreams = {
                       "http://a.xxx.com",
                       "http://b.xxx.com",
                       "http://c.xxx.com"
                                   }
                 ngx.var.upstream=upstreams[ math.random( #upstreams ) ]
                             ';

            #resolver 8.8.8.8;
            proxy_buffering off;
            proxy_redirect off;
            proxy_set_header Accept-Encoding "";
            proxy_set_header User-Agent $http_user_agent;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass       $upstream;
                    }
             }
    }

7.注意事项
我在一台 VPS 上很容易就安装完成了,但是在另外一台 VPS 就死活是 502 错误,找了好久才知道是 DNS 解析的问题,需要添加 resolver 8.8.8.8; 才能正常使用。

解答问题是在这里找到的:

http://stackoverflow.com/questions/17685674/nginx-proxy-pass-with-remote-addr

It seems a bit strange that nginx is failing to resolve the domain name at runtime rather than at configuration time (since the domain name is hard coded). Adding a resolver declaration to the location block usually fixes dns issues experienced at runtime. So your location block might look like:

location ^~ /freegeoip/ {
  #use google as dns
  resolver 8.8.8.8;
  proxy_pass http://freegeoip.net/json/$remote_addr;
}

而我将 resolver 8.8.8.8; 提到 location / 前面去了,作用是一样的。到此为止,将 Google 搜索和 Google Scholar 都配置完成了,解决了在学习中查找资料的问题。由于某同学的建议不要在博客上大肆宣传,所以这将部分配置写出,防止遗忘。

Leave a Reply