一、nginx配置文件:
server {
listen 80;
server_name a;
root /a;
index index.php index.htm index.html;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ^~ /b/ {
proxy_pass http://127.0.0.1:自定义/;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_read_timeout 600;
include fastcgi_params;
}
access_log a.log;
error_log error.a.log;
}
二、每一点细讲
1、index
index.php index.htm index.html;
这里的是会按照顺序来依次查询,第一个是查询index.php
2、try_files
try_files $uri $uri/ /index.php$is_args$args;
详情解析:
当用户请求 http://localhost/example 时,这里的 $uri 就是 /example。
try_files 会到硬盘里尝试找这个文件。如果存在名为 /$root/example(其中 $root 是项目代码安装目录)的文件,就直接把这个文件的内容发送给用户。
显然,目录中没有叫 example 的文件。然后就看 $uri/,增加了一个 /,也就是看有没有名为 /$root/example/ 的目录。
又找不到,就会 fall back 到 try_files 的最后一个选项 /index.php,发起一个内部 “子请求”,也就是相当于 nginx 发起一个 HTTP 请求到 http://localhost/index.php。
2、location ^~ /b/ {}
匹配任何已 /b/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。
^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。
3、proxy_pass http://127.0.0.1:自定义/;
解析:
假设下面用 http://192.168.1.1/proxy/test.html 进行访问。
location /proxy/ {
proxy_pass http://127.0.0.1/;
}
代理到URL:http://127.0.0.1/test.html
第二种(相对于第一种,最后少一个 / )
location /proxy/ {
proxy_pass http://127.0.0.1;
}
代理到URL:http://127.0.0.1/proxy/test.html
4、proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
在默认情况下经过proxy转发的请求,在后端看来远程地址都是proxy端的ip 。
添加这条配置之后:
意思是增加一个$proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是增加,而不是覆盖,当然由于默认的X-Forwarded-For值是空的,所以我们总感觉X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,实际上当你搭建两台nginx在不同的ip上,并且都使用了这段配置,那你会发现在web服务器端通过request.getHeader("X-Forwarded-For")获得的将会是客户端ip和第一台nginx的ip。
在第一台nginx中,使用
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
现在的$proxy_add_x_forwarded_for变量的"X-Forwarded-For"部分是空的,所以只有$remote_addr,而$remote_addr的值是用户的ip,于是赋值以后,X-Forwarded-For变量的值就是用户的真实的ip地址了。
到了第二台nginx,也使用
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
现在的$proxy_add_x_forwarded_for变量,
X-Forwarded-For部分包含的是用户的真实ip,
$remote_addr部分的值是上一台nginx的ip地址,
于是通过这个赋值以后现在的X-Forwarded-For的值就变成了"用户的真实ip,第一台nginx的ip"。
5、proxy_set_header Host $host;
服务器名和后端服务器的端口(访问端口)一起传送。
6、proxy_set_header X-Real-IP $remote_addr;
其中这个X-real-ip是一个自定义的变量名,名字可以随意取,这样做完之后,用户的真实ip就被放在X-real-ip这个变量里了,然后,在web端可以这样获取:
request.getHeader("X-real-ip")
7、 location ~ \.php$ {}
访问http://localhost/a.php,这时~ 开头表示区分大小写的正则匹配
8、try_files $uri /index.php =404;
则表示当尝试访问得文件返回404时,进行重定向。
9、fastcgi_pass 127.0.0.1:9000;
配置TCP使用端口:9000
10、fastcgi_index index.php;
fastcgi默认的主页资源,为ndex.php
11、fastcgi_buffers 16 16k;
控制 nginx 最多创建 16个大小为 16K 的缓冲区
12、fastcgi_buffer_size 32k;
fastcgi_buffer_size 则是处理 Response 时第一个缓冲区的大小,不包含在fastcgi_buffers中,
总计能创建的最大内存缓冲区大小是 16*16K+32K = 288k。
这些缓冲区是根据实际的 Response 大小动态生成的,并不是一次性创建的。比如一个 32K 的页面,Nginx 会创建 2*16K 共 2 个 buffers。
13、fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
脚本文件请求的路径
14、fastcgi_read_timeout 600;
读取时timeout的时间长度为600
使用nginx服务器如果遇到timeou情况时可以如下设置参数,使用fastcgi:
fastcgi_connect_timeout 75; 链接
fastcgi_read_timeout 600; 读取
fastcgi_send_timeout 600; 发请求
15、access_log a.log
日志配置
16、error_log error.a.log;
错误日志配置
本文详细介绍了如何使用nginx配置一个域名重定向到两个不同的项目站点,包括listen、server_name、root等基本配置,以及location、proxy_pass、proxy_set_header等关键设置,确保正确实现跨域请求和日志记录。
1万+

被折叠的 条评论
为什么被折叠?



