初始化安装
nginx的安装较为简单,只需在apt更新之后运行命令apt-get install nginx
。安装之后在浏览器中访问本机的ip地址,会看到“welcome to nginx”,OK一切正常。
此处说明一下,127.0.0.1、localhost和本机ip的区别。首先localhost是域名,指向的是127.0.0.1这个本机环路虚拟地址,在Windows的hosts文件或Linux的 /etc/hosts 文件中可以看到,访问这二者是不需要联网的,本机IP地址可以由本机或从外部访问,是本机对外开放的地址,这个地址是与物理网卡绑定的IP地址。
查找nginx目录
在通过apt安装nginx后,它为我们提供了一个基本结构,并快速的设置好了配置文件。所有的nginx的配置文件都在 /etc/nginx/ 下(此处只提供了Linux环境下的配置文件位置,Mac环境中使用homebrew安装的配置文件的位置与Linux环境有所不同)。需要添加新的配置的位置在 /etc/nginx/sites-enabled/
,在此目录下包含一个default文件,这个文件就是nginx首页的默认配置文件。接下来尝试建立自己的配置文件用于显示一个页面。在sites-enabled目录下新建一个空白文件命名为test,然后进行编辑。
- 注意: 在 /etc/nginx/ 目录下包含一个sites-available目录,这个目录一般在需要建立和管理多个站点的时候非常有用,可以帮助你更好的组织不同的项目,你需要在这里添加你的nginx配置文件并将它们链接至sites-enabled目录下,命令如下:
ln -s /etc/nginx/sites-available/dotcom /etc/nginx/sites-enabled/doctom
只有在 sites-enabled 目录下的配置文件才能真正被用户访问,但是同样可以将文件放在site-available目录下用来存档或者生成链接
配置静态服务器
Nginx配置文件有自己的格式,好消息是格式相当简单,看起来想css文件,先制定变量名,然后在花括号中编写命令,最顶层是server代码:
server {
}
-
listen 声明服务器监听的端口号。SSL在443端口,http默认端口是80,因此在URL中未定义端口的话一般为80,因为很有可能是去运行一个线上的服务器,因此最好定义监听端口为80。
server{ listen 80; }
默认端口严格来讲不是必要的,但是为了能够保证对整个流程足够了解,最好加上。接下来进入server_name
-
server_name 主要用来匹配URL地址,任意请求通过nginx时,它会查看URL并寻找server_name片段,如果你的站点是http://acmer.com,那么server_name应该为acmer.com,如果在域名解析时用了A记录并通过服务器指向http://xxx.com,你可以添加另外一个server代码,将server_name指向xxx.com,这段代码就会匹配来自这个域名的请求。
-
这个特性非常强大,这意味着你可以在单个nginx配置文件里托管无数站点,甚至包括不同域名的网站,你需要做的只是讲设置A记录并指向主机所在的IP,之后设置其他的nginx服务器配置。
-
针对server_name还有两点需要关注,首先是可以设置子域名。如果想要匹配http://test.example.com,设置相当简单,甚至可以指向一个完全不同的应用。第二是可以使用通配符
※
,或者正则匹配路由。下面简单配置下server_name到example.com
server {
listen 80;
server_name example.com
}
Nice,再进行一些配置就可以运行服务器了。
- root
这个是托管静态站点最关键的部分,如果只是想托管一些html和css文件,root部分要定义这些文件存放的路径,我喜欢把文件放在/var/www/
目录下,因此在这个目录下建立一个目录,/var/www/example/
,在这个目录下新建一个空表的html文件,随意输出一些代码
server {
listen 80;
server_name example.com;
root /var/www/example;
}
基本变量配置完毕,下一步配置路由。
- location 接收两个参数,一个字符串或正则表达式,和一段代码。字符串或正则用于匹配一个特定目录,如果你想让用户在访问example.com/whatever 时访问某个特定的页面,需要将whatever 设置为uri地址,在这里我们只要访问root目录,因此只需加上 / 内容暂时为空,稍后解释。
server {
listen 80;
server_name example.com;
root /var/www/example;
location / {
}
}
第一个参数可以有很多种写法。在以上区块内,我们需要路由指向结果页面,注意 / 会匹配所有的URL地址,因为在这里它被解释成一个正则,如果指向匹配某一个准确的字符串,主需要在上面加一个等号。
location = / {...}
现在我没要完成之前的代码,我们可以在区块内添加另一段指令,用于加载名为try_files的文件。 try_files接收一组文件名或正则,用于在根目录下查找,并会加载找到的第一个结果。对于我们的静态服务器来讲,我们希望找到一个在 / 之后紧跟着whatever的文件,例如:whatever.html,如果在 / 后面没有任何内容,则会寻找 index.html。这里我们进行简单的配置。
server {
listen 80;
server_name example.com;
root /var/www/example;
location / {
try_files $uri $uri/ /index.html
}
}
你可能会奇怪上面的$uri是从哪来的?其实是nginx提供的。每次有请求时,nginx会生成一系列变量,这些变量存储了请求的相关信息。
- 来自http://example.com的请求进入。
- nginx找到server片段代码,其中server_name为example.com,并使用它来处理请求。
- nginx匹配任意请求。因为这里的 / 会匹配根域名下的任意内容。
- 在匹配到的location代码中,nginx开始尝试加载一个文件。首先寻找一个未命名的文件,因为这里的uri匹配的就是没有名称的文件,所以无法找到,接着开始查找未命名的目录,依然无法找到,最后开始查找并加载根目录。下的 /index.html。
接下来想象一下如果添加一个名为test.html的文件到根目录下并访问 http://example.com/test.html,可以自己尝试一下。
可以任意的尝试修改这里的配置变量。例如,在访问一个网站时,用户访问某一个文件并没有加上 .html 的后缀,try_files同样会查找 $uri.html 并匹配相应的结果,因此在访问 http://example.com/whatever和http://example.com/whatever.html会得到相同的文件,你可以充分发挥想象力设置配置文件。
启动服务
总结一下配置的步骤。首先添加server选项,在nginx运行时,会查找 /etc/sites-enabled 目录下的所有配置文件用于显示对应内容。但是请等一下,你可能无法马上得到结果,因为nginx并不知道你所做的改动。为了让nginx真正读取到配置文件,需要重启服务器
service nginx reload
- 注意:
这里service命令实际上是调用了配置文件里的内容,这些都在使用apt是被生成。这里调用的实际上是 /etc/init.d/nginx reload