Nginx单IP配置多个站点

对于Nginx,一个IP上配置多个站点还是很常见的。尤其是在开发环境上,更是如此。

下面在我的阿里云上简单的实现这样一个需求:

在一个IP上通过对端口区分来配置多个站点。


[toc]

环境

手头上正好有一台阿里云学生机,趁着没过期,就拿来用吧。

  • 操作系统:centOS7
  • php-fpm
  • Nginx

初始化

在centos上搭建php-fpm+nginx环境不是很难,网上有很多的帖子,按照上面讲解的,把需要安装的软件安装一下就行了。

目录一览

安装完毕后,配置文件通常会在/etc/nginx目录下,我这边的内容如下:

默认安装配置文件内容

里面的nginx.conf就是默认的配置文件了。下面简单的来看下里面的大致内容。

默认Nginx的配置文件

一般来说,除非有特别需求,我们不会修改nginx.conf文件里面的内容。现在的话,可以把这个文件当做我们的参考项。

我个人认为里面比较重要的配置项有这么几个:

  • http:这个节点就代表了一个Nginx,是我们的大总管。它内部可以有多个Server配置项,代表多个站点。
  • include /etc/nginx/conf.d/.conf;* 这一行虽然看起来不起眼,但是对于配置多个站点而言,及极其的重要。这点待会再讲。
  • log_format: 日志的格式,这点将体现在Nginx日志记录的动作上。
  • access.log: 在这个选项的第一个单词是main,就是刚才log_format定义的日志格式了。后面对于error.log 同样适用。
  • Server节点:一个Server节点,包含了对一个站点的配置,这里面的同名内容将会覆盖http节点的配置,所以优先级对于一个站点而言,相对更高一点。
  • include /etc/nginx/default.d/.conf* 不难看到这个配置出现在Server节点内部,所以还是对本站点配置起作用的。这个default.d目录存放的是对于所有Server节点通用性的功能,其存在的意义就是能让我们少写一些重复性的配置内容。而是抽取出来,放到一个通用的目录下。
  • location的内容,待会再讲。

配置

下面进入正题,看看如何在一个IP上配置多个站点。那么首先,我们需要先创建几个文件夹,然后作为我们的多个站点。

站点准备

home/www目录下创建两个文件夹,一个是blog一个是forum,然后里面分别放一个index.php,注意内容可以良好的区分就可以了。

创建站点所需文件夹

添加配置文件

刚才我们也了解到,有多个站点的话其实就是多个Server节点,在nginx.conf中通过include /etc/nginx/conf.d/.conf来引入到了http节点,所以我们只需要在/etc/nginx/conf.d/*目录下创建我们特定于某个站点所需要的配置文件就可以了。

注意: 注意后缀名为.conf,不然按照include的规则,无法正确引入相关的配置文件。

你也可以像我这么做,如下:


添加blog和forum的配置文件

左侧的fastcgi_param SCRIPT_FILENAME 写错了,应该是$document_root,图片上没改过来,这点明确一下就可以了。

添加完配置文件之后就可以,重启Nginx了。在CentOS上重启的命令如下:

systemctl restart nginx

如果你的是Debian系的Linux的话,也可以使用:

service nginx restart

这时,可以通过浏览器访问,看看我们的配置项到底成功了没有。


检测配置是否成功

这样就成功的在一个IP上通过端口不同,配置了多个站点了。

疑难杂项

一开始刚刚接触Nginx的时候,对这个配置文件实在是摸不着头脑。那个时候,在我的印象中,php+apache才是黄金组合,没想到随着接触Nginx的时间变长,php-fpm+nginx的组合让我大开眼界。

在配置的道路上,总会有那么几个问题,一直困扰着我,下面我就总结一下,我个人认为的比较重要的问题吧。

fastcgi_pass

在Server节点的location内部,有这么一个配置项。很是让人摸不着头脑。

 location ~ \.php$ {
        root           /home/wwwroot;
        fastcgi_pass   127.0.0.1:9000;
        #fastcgi_pass  unix:/var/run/php-fpm/php-fpm.sock;
        #fastcgi_pass  unix:/tmp/php-cgi.sock;
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

从上面的配置文件中,我们也看到了好多个对它的不同的配置,那么到底该怎么选择呢?

在网上我找到了这么一条回答,感觉人家讲的挺好的。有兴趣的可以看看下面这篇文章。https://segmentfault.com/q/1010000004854045

总结来讲,有这么几点内容:

Nginx+php-fpm的进程间通信有两种方式

一个是TCP,另一个是Unix Domain Socket。

  • TCP: 格式为IP:端口, 可以跨服务器。
  • Unix Domain Socket不经过网络,只能用于Nginx跟PHP-FPM都在同一个服务器上的场景。

那么,对我们来说,要怎么选择呢? 答案是取决于php-fpm的配置。有下面两种方式:

  • 方式一:
php-fpm.conf: listen = 127.0.0.1:9000
nginx.conf:fastcgi_pass 127.0.0.1:9000

  • 方式二:
php-fpm.conf: listen = /tmp/php-fpm.sock
nginx.conf: fastcgi_pass unix:/tmp/php-fpm.sock

这里面php-fpm.sock是一个文件,是由php-fpm生成的,类型为srw-rw----, 具体这个路径怎么写,还是取决于你本地的php-fpm生成的sock文件的位置。

这两种都可以成功让php-fpm和Nginx组合起来,区别什么的,贴出大佬的原话应该比较有说服力。

UNIX Domain Socket可用于两个没有亲缘关系的进程,是目前广泛使用的IPC机制,比如X Window服务器和GUI程序之间就是通过UNIX Domain Socket通讯的.这种通信方式是发生在系统内核里而不会在网络里传播.UNIX Domain Socket和长连接都能避免频繁创建TCP短连接而导致TIME_WAIT连接过多的问题.对于进程间通讯的两个程序,UNIX Domain Socket的流程不会走到TCP那层,直接以文件形式,以stream socket通讯.如果是TCP Socket,则需要走到IP层,对于非同一台服务器上,TCP Socket走的就更多了.


fastcgi_pass配置问题

所以,下次就不用再纠结这个问题了,php-fpm.conf和nginx.conf的相关项保持一致就好了。

502 Bad GateWay

前几天Nginx还工作的好好的,不知道为啥,这周一一上班就出现了这个问题。
查看下Nginx的错误日志:tail -f /var/log/nginx/error.log

结果发现了下面的内容:

FastCGI send in stderr: "Primary script unknown" while reading response header from upstream...

网上大部分对此的解释是:

# nginx.conf 配置文件中fastcgi_param 中/script的问题,改成$document_root就好了。

我也照着改了下,发现还是不行,突然想到上周五修改了目录权限,去掉了写权限,会不会是这个问题呢,然后就抱着试一试的态度,执行了下面的命令:

chmod -R 775 target/path

然后就重启了下Nginx,惊讶的发现问题解决了。

真的是很无语的一个问题,所以下次再出现502的错误时,就多了一个参考的错误修复选项了。

总结

关于Nginx的配置,内容实在是太多了,暂且就先总结到这里吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单...
    rosekissyou阅读 10,180评论 5 124
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,635评论 24 1,002
  • 配置运行Nginx服务器用户(组) 用于配置运行Nginx服务器用户(组)的指令是user,其语法格式为: use...
    吃瓜的东阅读 4,468评论 0 41
  • 更改ip和dnsVi /etc/sysconfig/network-scripts/ifcfg-eth0vi /...
    Xwei_阅读 1,794评论 0 3
  • 子曰:“吾十有五而志于学,三十而立,四十而不惑,五十而知天命,六十而耳顺,七十而从心所欲。”孔子的人生六种境界常常...
    幸福清风阅读 1,570评论 0 3