Nginx 是一个很强大的高性能Web和反向代理服务器,它具有很多非常优越的特性,本次主要解决Nginx反向代理设置问题。
假定有一台能正常访问的外网Nginx服务器A和一台内网Nginx服务器B,服务器A能访问到服务器B,而外网用户无法直接访问到服务器B。现在通过服务器A配置Nginx反向代理服务器B从而实现外网用户访问到内网服务器。
配置反向代理

1.将域名test.wrdan.com解析到服务器A

2.在服务器A添加一个虚拟主机

server {
    listen 80;
    server_name test.wrdan.com;
    index index.php;
 
    location / {
        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;
        proxy_pass http://192.168.1.2:80; #设置内网服务器访问地址
 
        client_max_body_size 100m; #客户端允许上传的最大文件大小
        client_body_buffer_size 128k; #允许客户端请求的最大单文件字节数
 
        proxy_connect_timeout 5; #nginx跟后端服务器连接超时时间
        proxy_read_timeout 60; #连接成功后,后端服务器响应时间
        proxy_send_timeout 5; #后端服务器发送时间
 
        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服务器传递请求,而不缓冲到磁盘
        proxy_ignore_client_abort on; #不允许代理端主动关闭连接
    }
 
    access_log off; #关闭日志
}

3.确保服务器B在内网能用域名test.wrdan.com正常访问。

4.如果需要打开日志,在服务器B上这么设置

log_format access '$http_x_real_ip - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
 
access_log /var/log/nginx/access.log access;

默认的日志设置是这样的:

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  /var/log/nginx/access.log  main;

5.尝试从外网访问。

Nginx优化设置

大部分设置项来自lnmp.org

http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;
    access_log off;
 
    sendfile        on;
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 50m;
    tcp_nopush on;
 
    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.1;
    gzip_comp_level 2;
    gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
    gzip_vary on;
    gzip_proxied   expired no-cache no-store private auth;
    gzip_disable   "MSIE [1-6]\.";
 
    include conf.d/*.conf;
    include vhost/*.conf;
}