nginx配置xff(nginx是怎么配置的,尽量解释详尽点,谢谢了)

本文目录
nginx是怎么配置的,尽量解释详尽点,谢谢了
LNMP环境的搭建配置(CentOS6.2+nginx1.1.15+mysql5.5+php5.3.10)
一、安装前的准备
1、下载所需要的安装包
***隐藏网址***
***隐藏网址***
***隐藏网址***
2、首先对环境需要的库和编译工具进行安装
yum -y install gcc
gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype
freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2
glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs
e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel
openldap openldap-devel nss_ldap openldap-clients openldap-servers
二、安装过程
1、编译安装Mysql
1) 创建mysql安装目录及数据存放目录
# mkdir -p/usr/local/mysql/
# mkdir -p /data/mysql/
2)创建用户和用户组与赋予数据存放目录权限
# groupadd mysql
# useradd mysql -M -s/sbin/nologin
# chown mysql.mysql -R /data/mysql/
3)安装必要的组件
# yum -y install cmake
# yum -y installncurses-devel
4)开始编译安装Mysql
#cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS:STRING=utf8,gbk
-DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1
-DMYSQL_DATADIR=/data/mysql -DMYSQL_USER=mysql -DMYSQL_TCP_PORT=3306
# make
# make install
5)初始化数据库
# cd /usr/local/mysql
#
scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql
--datadir=/data/mysql/
6)配置环境
# cpsupport-files/my-medium.cnf /etc/my.cnf
# cpsupport-files/mysql.server /etc/init.d/mysql
# chmod 755/etc/init.d/mysql
# chkconfig mysql on
# exportPATH=/usr/local/mysql/bin:$PATH
7)启动并设置初始密码
# /etc/init.d/mysql start
# mysqladmin -urootpassword ’123456’
进行再修改密码的语句
》 UPDATE mysql.userSET Password = PASSWORD(‘newpwd’) WHERE User = ‘root’;(生新设置密码)
》 flush privileges;(刷新权限)
2、 编译安装nginx
1) 添加一个不能登录并且没有主目录的用户
# useradd www -M -s /sbin/nologin
2) 下载必要的组件并安装
***隐藏网址***
# unzip pcre-8.21.zip
# cd pcre-8.21
# ./configure
# make && makeinstall
3)下载编译安装nginx
***隐藏网址***
# tar zxvfnginx-1.1.15.tar.gz
# cd nginx-1.1.15
# ./configure
***隐藏网址***
***隐藏网址***
# make && makeinstall
4)启动nginx
#/usr/local/nginx/sbin/nginx
启动后,在浏览器里输入IP,即可查看到:Welcome to nginx!的欢迎界面
# echo"/usr/local/nginx/sbin/nginx" 》》 /etc/rc.local
4 编译安装php
1) 下载安装必要的组件
***隐藏网址***
wget
***隐藏网址***
ftp://mcrypt.hellug.gr/pub/crypto/mcrypt/libmcrypt/libmcrypt-2.5.7.tar.gz
***隐藏网址***
***隐藏网址***
***隐藏网址***
***隐藏网址***
***隐藏网址***
# yum -y installlibjpeg-devel libpng-devel
# tar zxvf libiconv-1.14.tar.gz
# cd libiconv-1.14
# ./configure
# make
# make install
# tar -zxvflibmcrypt-2.5.8.tar.gz
# cd libmcrypt-2.5.8
# ./configure
# make
# make install
# /sbin/ldconfig
# cd libltdl/
# ./configure--enable-ltdl-install
# make
# make install
# cd ../../
# tar zxvfmhash-0.9.9.9.tar.gz
# cd mhash-0.9.9.9
# ./configure
# make
# make install
# cd ../
ln -s/usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la
ln -s/usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so
ln -s/usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4
ln -s/usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8
ln -s/usr/local/lib/libmhash.a /usr/lib/libmhash.a
ln -s/usr/local/lib/libmhash.la /usr/lib/libmhash.la
ln -s/usr/local/lib/libmhash.so /usr/lib/libmhash.so
ln -s/usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2
ln -s /usr/local/lib/libmhash.so.2.0.1/usr/lib/libmhash.so.2.0.1
ln -s/usr/local/bin/libmcrypt-config /usr/bin/libmcrypt-config
# tar zxvfmcrypt-2.6.8.tar.gz
# cd mcrypt-2.6.8
# /sbin/ldconfig
#./configure
# make
# make install
# cd ../
2)编译安装php
# tar zxvfphp-5.3.10.tar.gz
# cd php-5.3.10
# ./configure
--prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc
--with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config
--with-iconv-dir=/usr/local/lib --with-freetype-dir --with-jpeg-dir
--with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml
--disable-rpath --enable-safe-mode
--enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization
--with-curl --with-curlwrappers --enable-mbregex --enable-fpm
--enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf
--with-openssl --with-mhash --enable-pcntl --enable-sockets --with-ldap
--with-ldap-sasl --with-xmlrpc --enable-zip --enable-soap --without-pear
--with-fpm-user=www --with-fpm-group=www
# makeZEND_EXTRA_LIBS=’-liconv’
# make install
3) 复制和修改php配置文件
# cp php.ini-production
/usr/local/php/lib/php.ini 或是
/usr/local/lib/php.ini
# cp/usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
# /usr/local/php/bin/php--ini //测试ini文件是否加载
注:Nginx+PHP整合,在安装时必须启用–enable-fastcgi 和 –enable-fpm
5 环境测试,写一个phpinfo文件测试一下
X-Forwarded-For缺陷与陷阱
X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。它不是RFC中定义的标准请求头信息,在squid缓存代理服务器开发文档中可以找到该项的详细介绍。
X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。 Squid 缓存代理服务器的开发人员最早引入了这一HTTP头字段,并由IETF在Forwarded-For HTTP头字段标准化草案中正式提出。
这一HTTP头一般格式如下:
X-Forwarded-For: client1, proxy1, proxy2, proxy3
其中的值通过一个 逗号+空格 把多个IP地址区分开, 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。 在上面这个例子中,这个请求成功通过了3台代理服务器:proxy1, proxy2 及 proxy3。请求由client1发出,到达了proxy3(proxy3可能是请求的终点)。请求刚从client1中发出时,XFF是空的,请求被发往proxy1;通过proxy1的时候,client1被添加到XFF中,之后请求被发往proxy2;通过proxy2的时候,proxy1被添加到XFF中,之后请求被发往proxy3;通过proxy3时,proxy2被添加到XFF中,之后请求的的去向不明,如果proxy3不是请求终点,请求会被继续转发。
因为伪造这一字段非常容易,所以应该谨慎使用X-Forwarded-For字段。正常情况下XFF中最后一个IP地址是最后一个代理服务器的IP地址, 这通常是一个比较可靠的信息来源。下面会详细说明,在什么情况下,这个信息并不准确。
***隐藏网址***
为了减缓可用的IP地址空间的枯竭, 大多数ISP网络或者公司网络中都会使用NAT设备,这样,一个公司或者一个小区的用户就可以共享使用一个IP来实现上网需求。NAT设备工作在IP层和TCP层,所以XFF不管怎么设置也无法解决这个问题。
这种情况下,我们也无法拿到客户的真实IP。
Windows:
Linux
访问以下两个网址,返回的网页会告诉你,你的公网IP是多少
可以用curl访问网址,举个例子
结果,我的真实ip是192.168.1.186(私有IP),但是在XFF中会显示我的IP为223.72.90.206。
***隐藏网址***
我们可以查看一下域名是否使用了加速乐(查看其他的安全服务也是类似的方法)
结果,XFF中有一层proxy就是加速乐的IP,由于加速乐有很多节点,所以这个IP地址新并不是固定的。内部消息显示加速乐节点的IP要达到上万个,尽管我太想相信。但是这至少说明一点,就是XFF中proxy的IP地址是多变的。
最近测试发现,使用电信4G网络的时候,XFF会莫名其妙的加入多个proxy代理,但是这个IP地址实在是无法查证,我们姑且认为他们也是一种安全服务吧
攻击者可以很容易伪造XFF,在发出请求时在XFF值中插入多个IP地址,以混淆服务端获取到客户端的真实IP。
结论,从XFF中的获取到的客户端IP地址并不可信,在使用各种ACL策略的时候,需要读者权衡利弊来满足业务需求。
***隐藏网址***
但是,上面的配置有一些问题,你发现什么问题了吗?
首先,我们解释一下上面最后一条配置语句的含义
实际上的含义是
我们可以看到, X-Forwarded-For加上$remote_addr。但是有一个问题,realip模块要比proxy模块运行的早,在realip模块中会把remote_addr重置为客户端IP,这样会导致 X-Forwarded-For设置错误。
我们拿proxy3为例,正常情况下,XFF传到proxy4服务时,XFF的值是
如果按照上面的配置的话,XFF值会是
如果内部有两级Nginx的话,XFF值会是
总之,只要是XFF出现的重复的IP地址,就有理由怀疑是Nginx配置引起的。
下面是才是realip的正确配置
remote_addr的副本信息,当realip模块修改了 realip_remote_addr用于保留$remote_addr的原始值。
假设有这样一个XFF
其中,如果proxy2,proxy3是我们已知(可信)代理的话,我们可以确定proxy1的IP地址是可信的。
nginx 配置详解是怎么样的
Nginx配置文件主要分为四部分:main(全局配置)、server(主机设置)、upstream(上游服务器设置)和location(URL匹配特定位置后的设置)每部分包含若干个指令。
Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。
并且支持很多第三方的模块扩展,Nginx的稳定性、功能集、示例配置文件和低系统资源的消耗让他后来居上,在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。
nginx 配置注意事项
Nginx可以对不同的文件做不同的缓存处理,配置灵活,并且支持FastCGI_Cache,主要用于对FastCGI的动态程序进行缓存。配合着第三方的ngx_cache_purge,对制定的URL缓存内容可以的进行增删管理。
events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
nginx变量
请求行中,名称为 name 的参数的值。比如,当请求行是"GET /nginx/varindex/?from=rss HTTP/1.1"时, arg_ name 的值是空字符串
如果请求行中包含参数,那么$is_args的值是"?",否则是空字符串
请求行中的全部参数(也就是查询字符串)。比如,当请求行是"GET /nginx/varindex/?a=b&c=d HTTP/1.1"时, args的值是空字符串
名称为 name 的cookie的值
完整的原始的请求行。比如:"GET /b/../a?a=b HTTP/1.1"(uri不会被规范化)
用来获取任意请求头的值。
HTTP header的命名方式是:每个单词的首字母大写,其余字母小写,单词之间用中划线("-")连接。比如,User-Agent、Content-Type、X-Forwarded-For等。
请求头名称和 name***隐藏网址***
请求的长度,包含请求行、请求头和请求体
请求方法,比如GET或POST
完整的原始的URI(带参数)
***隐藏网址***
"Content-Length"请求头的值
"Content-Type"请求头的值
应用于当前请求的root或alias指令的值
规范化后的URI。所谓的规范化是指:将 以"%XX"形式编码的文本进行解码 之后,解决对相对地址"."和".."的引用,并将多个相邻的"/"压缩成一个。
请求处理期间,$uri的值可能发生改变,比如在发生内部重定向或者使用index文件的时候
Nginx按照下面的优先级顺序,设置$host的值:
一般情况下,请求行中只会包含 Request URI ,也就是 URI 和 QUERY STRING ,不会包含 host name。但是,当使用Nginx做HTTP正向代理服务器的时候,请求行中会包含host name
在客户端传递来的X-Forwarded-For请求头后面追加 remote_addr。
比如,客户端传递来的XFF请求头是:192.168.1.1, 192.168.1.2; proxy_add_x_forwarded_for等于192.168.1.1, 192.168.1.2, 192.168.1.3
应用于当前请求的root或alias指令的值所对应的绝对路径,所有的符号连接都会被解析成真实路径
请求协议,通常是"HTTP/1.0"、"HTTP/1.1"、"HTTP/2.0"
当前请求对应的资源的路径。
该变量的值是基于root(或alias)指令的值,以及请求的URI计算出来的。比如,当root指令的值是/data/w3,URI是/images/logo.jpg时,该变量等于/data/w3/images/logo.jpg
下发给客户端的字节数(不包含响应头)
从 接收到请求的第一个字节 到 把响应的最后一个字节发送给客户端,所经历的时间。单位是秒,精确到毫秒
用于获取下发给客户端的任意响应头的值。响应头名称和 name 之间的转换方式是:将响应头名称转换成小写形式,并将中划线("-")替换成下划线("_")
下发给客户端的响应码
二进制形式的客户端地址。对于IPV4地址,该值的长度是4字节,对于IPV6地址该值的长度是16字节
连接的序号
在开启keepalive的情况下,客户端可以使用一条连接发起多个请求,该变量用于记录通过一条连接发起的请求数
本地时区的当前时间
GMT格式的当前时间
运行Nginx的主机的主机名,比如:vm 0 16_centos
当前的时间戳,精确到毫秒。比如,1551609371.088
Nginx的版本号
Worker进程的PID
在proxy_pass指令中指定的被代理服务的名称(可能是upstream的名称)
在proxy_pass指令中指定的被代理服务的端口。如果在proxy_pass指令中未指定端口,那么该变量等于协议的默认端口
客户端地址
客户端端口
在开启basic authentication的时候,客户端所使用的用户名
接收请求的虚拟主机的地址
接收请求的虚拟主机的端口
接收请求的虚拟主机的名称
ISO 8601标准格式的本地时间
通用日志格式的本地时间
保存upstream server的ip地址和端口,或Unix套接字的路径。在请求处理期间,如果请求被代理到多个upstream server,那么它们的地址之间用","分隔,比如:"192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock"。当发生(由error_page等发起的)从一个server group到另外一个server group的内部重定向时,不同的server group之间用":"分隔,比如:"192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80"。如果server group中没有可用的server,那么该变量的值是server group的名字
从upstream server接收到的字节数。来自于多个连接的值,像$upstream_addr中的地址一样,用","和":"分隔
发送到upstream server的字节数。来自多个连接的值,像$upstream_addr中的地址一样,用","和":"分隔
该变量用来显示缓存的使用情况。其值是:
建立到upstream server的连接所花费的时间。单位是秒,精确到毫秒。对于SSL连接,该时间也包含SSL握手所花费的时间。建立多个连接所花费的时间之间,像$upstream_addr中的地址一样,用","和":"分隔
upstream server返回的"Set-Cookie"响应头中的,名称 name 的cookie的值。只有最后一个server返回的响应中的cookie会被保存
从upstream server接收响应头所花费的时间。单位是秒,精确到毫秒。多个响应所花费的时间之间,像$upstream_addr中的地址一样,用","和":"分隔
用于获取upstream server返回的任意响应头的值。
响应头名称和 name 之间的转换方式是:将响应头名称转换成小写形式,并将中划线替换成下划线。
只有最后一个server的响应头会被保存
保存从upstream server获取到的响应的长度。单位是字节。多个响应的长度之间,像$upstream_addr中的地址一样,用","和":"分隔
保存从upstream server接收响应所花费的时间。单位是秒,精确到毫秒。多个响应所花费的时间之间,像$upstream_addr中的地址一样,用","和":"分隔
保存从upstream server获取到的响应的状态码。多个响应的状态码之间,像$upstream_addr中的地址一样,用","和":"分隔

更多文章:
switch case用法举例python(为什么Python中没有Switch/Case语句)
2025年9月27日 18:45
checkbox 选中事件(js动态生成的checkbox取值和选中事件)
2025年9月26日 11:00
用数据库做管理系统(何谓数据库管理系统简述数据库管理系统的功能)
2026年7月20日 19:30
个人述职报告ppt(简约彩色个人述职报告PPT模板最新怎么样)
2025年9月19日 22:30
驽马十驾的故事(“驽马十驾,功在不舍”是什么意思古代早有“龟兔赛跑”的故事!)
2025年8月1日 23:30
memory lapse是什么意思?collapse;是什么意思
2026年5月28日 23:45
delphi三层数据库技术(delphi 多个数据库使用一个三层问题)
2025年12月4日 01:45
count函数怎么统计文字(count如何计算同一种颜色的文字)
2025年6月1日 12:45
java打印爱心图案的代码(html爱心代码用devc++能打出来嘛)
2026年8月5日 05:00
python如何使用多线程(Python的keyboard模块使用多线程)
2026年9月14日 03:00












