nginx的反向代理nginx的正向代理和反向代理
用nginx做反向代理
前提是已经安装了nginx(安装步骤见上一篇博客)
代理机的配置步骤:
nginx代理机的ip:192.168.186.128
cd /usr/local/nginx/conf/
mv nginx.conf nginx.conf.old
vi nginx.conf (这是最优配置)
#user nobody nobody;
worker_processes 8;
error_log logs/error.log warn;
pid logs/nginx.pid;
worker_rlimit_nofile 51200; (确保ulimit -n,打开文件数至少为51200)
events {
use epoll;
worker_connections 51200;
}
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" "$request_time"';
#charse gb2312;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
sendfile on;
#tcp_nopush on;
tcp_nodelay on;
client_header_timeout 30;
client_body_timeout 30;
send_timeout 30;
client_max_body_size 100M;
proxy_connect_timeout 100;
proxy_send_timeout 100;
proxy_read_timeout 100;
proxy_buffer_size 16k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
keepalive_timeout 60;
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 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript;
gzip_vary on;
upstream web1 {
server 192.168.186.129;
server 192.168.186.130:8080; (默认80端口不需要指定,非80端口需要指定)
}
upstream web2 {
server 192.168.186.131;
server 192.168.186.132;
}
server { (定义一个默认的虚拟主机)
listen 80 default;
server_name _;
return 500;
}
include vhosts/*.conf;
}
注意:include vhosts/*.conf; 这一行是添加在http{}模块里的,注意后面的分号
默认虚拟主机的意义:
nginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了你的ip)的时候生效. 这个设置非常有用, 比如别人通过ip或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回500.目前国内很多机房都要求网站主关闭空主机头,防止未备案的域名指向过来造成麻烦
mkdir vhosts (这个vhosts目录是在/usr/local/nginx/conf/目录下创建的)
cd vhosts
vi .conf
server{
listen 80;
server_name ;
access_log /usr/local/nginx/logs//access.log;
location / {
proxy_pass http://web1;
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_next_upstream http_502 http_504 error timeout invalid_header;
}
}
注意:proxy_next_upstream http_502 http_504 error timeout invalid_header; 这行的作用是:如果后端处理用户请求的web服务器返回502 504 error timeout等错误时,自动将请求转发到此upstream主机池中的另外一台服务器,实现故障转移
vi .conf (可以在vhosts目录下创建多个虚拟主机,来作为反向代理)
server{
listen 80;
server_name ;
access_log /usr/local/nginx/logs//access.log;
location / {
proxy_pass http://web1;
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_next_upstream http_502 http_504 error timeout invalid_header;
}
}
/usr/local/nginx/sbin/nginx -s stop (重新启动nginx)
/usr/local/nginx/sbin/nginx
后端web服务器的配置:
LNMP环境:前提是已经安装了lnmp环境(安装步骤见上一篇博客)
nginx的配置:
vi nginx.conf
#user nobody nodoby; worker_processes 8; error_log logs/error.log; pid logs/nginx.pid; worker_rlimit_nofile 51200; events { use epoll; worker_connections 51200; } 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'; sendfile on; tcp_nopush on; tcp_nodelay on; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 8m; server_tokens off; keepalive_timeout 60; 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 128k; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml text/javascript; gzip_vary on; server { listen 80; server_name ; root /opt/nginx/www/; index index.html index.php index.htm; access_log logs//access.log main; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ .*\.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location ~ .*\.(gif|jpg|png|swf|bmp|jpeg)$ { expires 10d; } location ~ .*\.(js|css)?$ { expires 1h; } } server { listen 80; server_name ; root /opt/nginx/www/; index index.html index.php index.htm; access_log logs//access.log main; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ .*\.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location ~ .*\.(gif|jpg|png|swf|bmp|jpeg)$ { expires 10d; } location ~ .*\.(js|css)?$ { expires 1h; } } }注意:也可以使用include vhosts/*.conf;将两个虚拟主机单独作为一个文件
mkdir -p /opt/nginx/www/{,} (创建网站根目录)
cd /opt/nginx/www//
echo www > index.html
cd /opt/nginx/www//
echo ftp > index.html
php配置:
php不需要做任何配置
测试:
对 和 作DNS解析
或者在代理服务器192.168.186.128的/etc/hosts文件写入:
192.168.186.128
192.168.186.128
在windows上打开浏览器分别访问 和
此时需要在windows的/hosts文件里也加入:
192.168.186.128
192.168.186.128
附加:真实的工作环境中,我们需要对两个主机名 和 作DNS解析
这两个域名的A记录,对应的ip是nginx代理服务器的ip,不是后端web服务器的ip
web服务器nginx配置文件里配置的server{}里面的主机名只是一个标识。比如我们访问,代理服务器把请求交给后端的web服务器去处理,首先会去找主机名为的虚拟主机,由它去处理;若web服务器没有主机名为的虚拟主机,则默认由第一个虚拟主机去处理这个请求。
反向代理交给tomcat:
user nginx nginx; worker_processes 2; error_log logs/error.log; pid logs/nginx.pid; worker_rlimit_nofile 65535; events { use epoll; worker_connections 65535; } 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'; server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; sendfile on; #tcp_nopush on; tcp_nodelay on; client_header_timeout 30; client_body_timeout 30; send_timeout 30; client_max_body_size 100M; keepalive_timeout 60; proxy_connect_timeout 100; proxy_send_timeout 100; proxy_read_timeout 100; proxy_buffer_size 16k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml text/javascript; gzip_vary on; upstream web1{ server 192.168.247.128:8080; } server { listen 443; server_name ; root /opt/nginx/www/; index index.html index.htm index.jsp; ssl on; ssl_certificate /usr/local/nginx/ca/server.crt; ssl_certificate_key /usr/local/nginx/ca/server.key; access_log logs//access.log main; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ .*\.jsp$ { proxy_pass http://web1; 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_next_upstream http_502 http_504 error timeout invalid_header; } location ~ .*\.(gif|jpg|png|swf|bmp|jpeg)$ { expires 10d; } location ~ .*\.(js|css)?$ { expires 1h; } } #server { #listen 80 default; #server_name _; #return 500; #} }