PHP 中获取 Nginx 使用反向代理或 CDN 后的客户端真实 IP

获取 Nginx 反向代理后的客户端 IP,基本是按一定顺序检测以下参数中的信息: HTTP_CLIENT_IP HTTP_X_REAL_FORWARDED_FOR HTTP_X_FORWARDED_FOR REMOTE_ADDR 在未使用 CDN 和反向代理情况下 当业务服务器直接暴露在公网上,并且未使用 CDN 和反向代理服务器时,可以直接使用 remote_addr: $_SERVER['REMOTE_ADDR'] 这时候 HTTP_X_FORWARDED_FOR 和 HTTP_X_REAL_IP 都是可以被伪造的,但 REMOTE_ADDR 是客户端和服务器的握手 IP,即 client 的出口 IP,伪造不了。 在使用 CDN 和反向代理情况下 铁律 当多层代理或使用 CDN 时,如果代理服务器不把用户的真实 IP 传递下去,那么业务服务器将永远不可能获取到用户的真实 IP。 如果 WEB 服务器上层也是使用 Nginx 做代理或负载均衡,则需要在代理层的 Nginx 配置中明确 XFF 参数,累加传递上一个请求方的 IP 到 header 请求中。以下是代理层的 Nginx 配置参数。 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; 只有一层代理的情况 我们按上面的配置发起一个伪造请求,10.100.11.25 是我电脑的 IP,链路为: ...

June 2, 2017 · 3 min · 438 words · Me

PHP 中 this self parent 用法

self:: 调用本类属性、方法;可以抑制方法多态性。 parent:: 调用父类属性、方法。 static:: 调用静态属性、方法;可以体现多态性。 $this-> 调用本实例的属性、方法;$this:: 可以调用静态属性、方法;但是无法在静态方法里使用;可以体现多态性。 -> object-operator, you always know you’re dealing with an instance. :: scope-resolution-operator, you need more information about the context. <?php class A { public static function newStaticClass() { return new static(); } public static function newSelfClass() { return new self(); } public function newThisClass() { return new $this(); } } class B extends A { public function newParentClass() { return new parent(); } } class C extends B { public static function newSelfClass() { return new self(); } } $c = new C(); var_dump($c::newStaticClass()); // C and is same C::newStaticClass() var_dump($c::newSelfClass()); // C because self now points to "C" class var_dump($c->newThisClass()); // C var_dump($c->newParentClass()); // A because parent was defined *way back* in class "B" References php - When to use self over $this? - Stack Overflow

May 25, 2017 · 1 min · 136 words · Me

【摔跤吧,爸爸】随笔

周末看了《摔跤吧,爸爸》,也是第一次独自电影院看电影,试写一篇影评纪念下。 注意:严重剧透预警。 主角爸爸是印度全国摔跤冠军,一心想着为国家赢取一枚金牌。可自己没能实现梦想,把梦想转移给了自己还未出世的孩子。可事与愿违,想要男孩的主角爸爸的前三个孩子都是女孩,第四个还是女孩。主角爸爸近乎要放弃为国争取金牌的梦想时,却意外看的了大女儿、二女儿身上的摔跤天赋。 主角妈妈在得知主角爸爸准备将女儿们训练为拳击手时,道出了 “你不能将你的梦想施加在女儿们身上”,主角爸爸沉思片刻 “给我一年时间,其间你不要插手,如果没成功,我将有永远放弃我的梦想”。在主角爸爸说出这句话之前,我是反对父母将自己的梦想让孩子去实现的,也更没有去争取过孩子们的想法,现实中这样做的父母我是常为 Loser. 但是主角爸爸的回答让我看到的不是一个:被自己个人梦想冲昏头,用孩子的全部去成就自己的父亲。主角爸爸是讲道理的,一年后如果失败也会甘愿放弃。坚持与固执的区别也许就在此。 主角爸爸变身为女儿们的魔鬼摔跤教练,每天除了上学就是训练,跑步时衣服不合适换男生衣服,找侄子当陪练,没有力量加餐牛奶、鸡肉,长头发难清理剪成了寸头。受苦中的女儿们找妈妈求情,主角妈妈遵守承诺,不干预主角爸爸的训练。这里真的要给主角妈妈点赞,后面女儿们的成功,女儿们、主角爸爸的努力在明面放着,而主角妈妈的守诺不干预,对主角爸爸的信赖,是同样的伟大。不然那柔弱的耳边风不知乱了多少坚定的意志。 训练太辛苦的女儿们采用消极怠工对抗主角爸爸。破坏闹钟、破坏场地、假摔示弱。而旷工一天参加好友的婚礼现场被主角爸爸收拾。在与好友诉苦时,才发现了:对比其他女孩一望到底的家庭妇女人生,主角爸爸的狠心是那样让人羡慕。 观念改变的女儿们开始主动训练。大女儿首次参赛就初露锋芒,差一点将男孩对手打败。逐渐成长的大女儿愈战愈勇的直到赢得全国冠军。全国冠军都会进入国家体育学校学习,大女儿也要离开主角爸爸接受新教练的训练,备战世界大赛。从小镇走出来的大女儿,没了主角爸爸的严格管束,开始着迷于这外面多彩的世界。吃油炸食品、留起头发、逛街、电影院。假期回家的大女儿用自己新学的技巧击败了主角爸爸,更是产生自我膨胀,对主角爸爸传统技术技巧的不屑与不信任。 国际大赛上大女儿频频失利,无能教练将此归为命运。与此同时坚信主角爸爸训练方式的二儿女也获得全国冠军,进入国家队。在二儿女和主角妈妈的劝解下,一通电话化解了大女儿和主角爸爸的隔阂。主角爸爸亲自来到体育学校,为大女儿备战下次的国际大赛。 主角爸爸在仔细研究大女儿对手后,制定了针对性的战术帮助大女儿杀入决赛。无能教练为了不让主角爸爸抢了自己的功劳,在决赛开始前将主角爸爸骗入小黑屋,无法让主角爸爸指导大女儿比赛。决赛第二局大女儿没能把握赛点,让对手追平。主角爸爸继续被困,只能默默祈祷。决赛最后一局,大女儿大比分落后,最后 10 秒大女儿脑海闪现着主角爸爸的叮咛,一击 5 分绝杀翻盘,赢得世界冠军。冠军的国歌声奏起,小黑屋中的主角爸爸也被路人解救,冲入赛场的主角爸爸与大女儿四目相对,此时这已经不是大女儿或主角爸爸哪一个人的冠军,而是所有正在与命运抗战者的胜利。 主角爸爸:“你是我的骄傲” 电影的专业手法和技术自己不懂,但是自己有个感觉:影片后期有大量的摔跤比赛,时不时有种看奥运赛的感觉,但是自己并没有感到乏味。电影故事情节很寻常,但是娓娓道来,很多细节小事让节奏不拖沓。故事人物有主角爸爸的理性和坚持、主角妈妈的守诺不干预、女儿们自我的成长、侄子的酱油加醋、无能教练损人为己 电影给我也留下了几个现实问题: 父母的认识经验一定比子女高的多,主角爸爸在看到女儿们的摔跤天赋时,狠心训练与女儿本身的意愿如何选择? 父母逐渐变老,他们真的跟不上我们了吗? 如何辨别无能教练的瞎指挥? – EOF –

May 14, 2017 · 1 min · 26 words · Me

区分 NGINX 中 fastcgi_params fastcgi fastcgi-php

NGNIX 有两份 fastcgi 配置文件,分别是 fastcgi_params 和 fastcgi.conf,其区别只有一点点。到目前为止,由于 package managers,他们仍然引起新用户的混淆。 在自己系统中还有份 snippets/fastcgi-php.conf,这个又是啥? fastcgi_params vs fastcgi.conf 它们都是用于配置 NGINX 与 FastCGI 应用程序通信的参数文件。 fastcgi_params: 包含了FastCGI应用程序所需的最基本参数,如SCRIPT_FILENAME、QUERY_STRING等。这些参数通常不需要修改。 fastcgi.conf: 包含了更高级的FastCGI参数,可以用于优化FastCGI应用程序的性能,如设置连接超时时间、缓冲区大小等。 fastcgi.conf 比 fastcgi_params 多了一行 SCRIPT_FILENAME 的定义 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 注意:$document_root 和 $fastcgi_script_name 之间没有 /。 原本 NGNIX 只有 fastcgi_params,后来发现很多人在定义 SCRIPT_FILENAME 时使用了硬编码的方式,于是为了规范用法便引入了 fastcgi.conf。 不过这样的话就产生一个疑问:为什么一定要引入一个新的配置文件,而不是修改旧的配置文件? 这是因为fastcgi_param 指令是数组型的,和普通指令相同的是:内层替换外层;和普通指令不同的是:当在同级多次使用的时候,是新增而不是替换。 换句话说,如果在同级定义两次 SCRIPT_FILENAME,那么它们都会被发送到后端,这可能会导致一些潜在的问题,为了避免此类情况,便引入了一个新的配置文件。 server { listen 80; server_name foo.com; root /path; index index.html index.htm index.php; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { try_files $uri =404; include fastcgi.conf; fastcgi_pass 127.0.0.1:9000; } } fastcgi-php.conf fastcgi-php.conf 是一个 Nginx 配置文件片段,用于配置 Nginx 服务器与 PHP FastCGI 进程之间的通信。它定义了 FastCGI 连接的参数和选项,以及如何处理 PHP 脚本。通常,这个文件是在 Nginx 的主配置文件中包含的,以确保 Nginx 能够正确地将请求发送到 PHP FastCGI 进程。 ...

April 22, 2017 · 2 min · 234 words · Me

区分 CGI FastCGI PHP-CGI PHP-FPM

更新 2023-03-20 提问 ChatGPT 3.5 CGI(Common Gateway Interface)是一种通用的 Web 服务器接口标准,它定义了 Web 服务器和应用程序之间进行通信的方式。CGI 程序在每次请求时都会启动一个新的进程,处理完请求后就会结束进程,因此效率较低。 FastCGI 是 CGI 的一种改进技术,它使用长连接的方式,使得多次请求可以在同一个进程中处理,从而提高了效率。 PHP-CGI 是 PHP 的 CGI 版本,它可以让 PHP 脚本在 Web 服务器上运行,但由于 CGI 的低效率,PHP-CGI 的性能也比较低。 PHP-FPM(PHP FastCGI Process Manager)是一个用于管理 PHP FastCGI 进程的工具,它可以提高 PHP 的性能和稳定性。 关联和区别: CGI 和 FastCGI 都是 Web 服务器和应用程序之间通信的方式,但 FastCGI 在性能上比 CGI 更好。 PHP-CGI 和 PHP-FPM 都是 PHP 在 Web 服务器上运行的方式,但 PHP-FPM 可以有效提高 PHP 的性能和稳定性。 作用举例: 如果使用 CGI 或 PHP-CGI 来运行 PHP 脚本,每次请求都需要启动一个新的进程,效率较低。而如果使用 FastCGI 或 PHP-FPM,则可以使用长连接的方式,提高效率。 使用 PHP-FPM 时,可以配置多个进程,通过负载均衡的方式来分担请求,从而提高稳定性。 CGI Common Gateway Interface,HTTP 服务器与你的或其它机器上的程序进行“交谈”的一种协议,其程序须运行在网络服务器上。 ...

April 21, 2017 · 2 min · 244 words · Me

MySQL 5.6 5.7 组内排序的区别

MySQL 5.7 对比 5.6 有很多的变化。一个常见的需求:按条件分组后,取出每组中某字段最大值的那条记录。其实就是组内排序的问题,我的做法是:子查询先进行倒序排序,外层查询分组。 示例 +----+----+-------+ | id | no | name | +----+----+-------+ | 5 | 5 | Mike | | 4 | 4 | Herry | | 3 | 3 | wyett | | 2 | 2 | John | | 7 | 2 | John | | 1 | 1 | Mike | | 6 | 1 | John | | 8 | 1 | Mike | | 9 | 1 | Mike | +----+----+-------+ 要求:取出每人(按 name),最大 no 的记录。 ...

April 20, 2017 · 4 min · 765 words · Me

MySQL 管理用户与访问授权

MySQL 创建用户、修改密码、删除用户;查看、授予、撤销用户权限;对 MySQL 远程访问的新理解。 -- 创建用户 + 授权 GRANT ALL PRIVILEGES ON _._ TO 'tom'@'%' IDENTIFIED BY 'pwd123' WITH GRANT OPTION; -- 查询权限 SHOW GRANTS FOR 'tom'@'%'; -- 授权 GRANT SELECT ON `my_db`.* TO 'tom'@'%'; -- 撤权 REVOKE ALL PRIVILEGES ON `my_db`.* FROM 'tom'@'%'; REVOKE GRANT OPTION ON `my_db`.* from 'tom'@'%'; -- not necessary FLUSH PRIVILEGES; 管理用户 创建用户 CREATE USER 'username'@'host' IDENTIFIED BY 'password'; username:创建的用户名 host:该用户在哪个主机上可以登陆。如果是本地用户可用 localhost;如果想让该用户可以从任意远程主机登陆,可以使用通配符 % password:该用户的登陆密码。密码可以为空,如果为空则该用户可以不需要密码登陆服务器 例子: ...

April 11, 2017 · 2 min · 376 words · Me

Ubuntu 命令行下免密码执行 sudo 命令

解决你的问题的方法是将你的用户加入 sudoers 文件。 sudo visudo 在文件底部输入: username ALL=(ALL) NOPASSWD: ALL 这只适用于终端窗口中的 sudo 命令。例如,当你尝试在 software center 中安装软件包时,将提示你输入密码。 References command line - Execute sudo without Password? - Ask Ubuntu

April 10, 2017 · 1 min · 27 words · Me

Ubuntu 下使用 sendmail mail 发送邮件

使用邮件发送程序的执行情况、运行日志都非常方便,Ubuntu 下搭建邮件服务也不复杂。 sendmail install sudo apt-get install sendmail configure run sendmail’s config and answer Y to everything sudo sendmailconfig mail install sudo apt-get install mailutils test echo 'test-email-content' | mail -s 'email title' xxx@gmail.com sendmail mail 区别 先需要搞清三个概念: 邮件用户代理(MUA,Mail User Agent) 邮件传送代理(MTA,Mail Transport Agent) 邮件分发代理(MDA,Mail Deliver Agent) sedmail 是负责邮件传输的 MTA,类似 apache、nginx 的作用。mail 是用户使用客户端 MUA,类似 foxmail。 References Install and configure Sendmail on Ubuntu Linux 下 mail、mailx 和 sendmail 的区别? - 知乎

April 6, 2017 · 1 min · 70 words · Me

Git 在工作目录之间使用 push 进行同步

Pushing to a non-bare repo is now possible (Git 2.3.0 February 2015). And it is possible when you are pushing the branch currently checked out at the remote repo! 现在已经是可以在俩个 non-bare 的仓库之间推送代码。 只需要再远程仓库配置: git config receive.denyCurrentBranch updateInstead 就可以直接 push 分支到远程,并更新工作区。此方法可以用于项目部署。 receive-pack: add another option for receive.denyCurrentBranch When synchronizing between working directories, it can be handy to update the current branch via ‘push’ rather than ‘pull’, e.g. when pushing a fix from inside a VM, or when pushing a fix made on a user’s machine (where the developer is not at liberty to install an ssh daemon let alone know the user’s password). ...

March 30, 2017 · 1 min · 184 words · Me