这篇文章主要讲述如何在ubuntu环境下搭建和配置使用nginx服务器。
云服务系统,操作系统是ubuntu 14.04,也可以用本地的电脑进行配置,操作步骤都是相同的,在ip访问的时候可能有点不同。
主要翻译官网的文章以及自己的安装过程总结。
1. 安装nginx_signing.key
这个文件的主要作用是给nginx仓库签名授权以及消除在安装过程中因为缺少PGP的警告。
不用太理解是怎么回事,大概就是申请权限之类的。
文件的下载目录,右键保存就可以
https://nginx.org/keys/nginx_signing.key
安装命令
sudo apt-key add nginx_signing.key
2. 更新源,请按照下面系统对应
Version | Codename | Supported Platforms |
12.04 | precise | x86_64, i386 |
14.04 | trusty | x86_64, i386, aarch64/arm64 |
16.04 | xenial | x86_64, i386, ppc64el, aarch64/arm64 |
16.10 | yakkety | x86_64, i386 |
deb http://nginx.org/packages/debian/ codename nginx其中的codename是根据系统来选的,我的系统是14.04,所以选择trusty
deb-src http://nginx.org/packages/debian/ codename nginx
具体的示例
root@wangrl:/home# vim /etc/apt/sources.list
deb http://nginx.org/packages/ubuntu/ trusty nginxdeb-src http://nginx.org/packages/ubuntu/ trusty nginx
3. 然后下面两个命令完成安装:
apt-get update4. 验证安装,可以直接在浏览器上输入ip地址。
apt-get install nginx
47.93.38.195会弹出提示:
Welcome to nginx!
If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.
For online documentation and support please refer tonginx.org.
Commercial support is available atnginx.com.
Thank you for using nginx.
表明已经安装成功,接下来是讲述nginx服务器基本配置和使用。在确保nginx已经安装的情况下,接着介绍下面的内容。
nginx 有一个主进程和几个工作进程,主进程的作用是读取配置文件,管理工作进程,工作进程做真正的处理请求。nginx 采用event-based 模型和OS-dependent机制更有效地把请求分发给各个工作进程。工作进程的数量已经在配置文件中定义,可以是固定的数目也可以根据CPU核的数量动态地调整。
nginx和各个模块的工作方式都已经在配置文件中定义。默认情况下文件的名称是nginx.conf,放在/usr/local/nginx/conf, /etc/nginx, 或者/usr/local/etc/nginx等目录下。
5. 开启/暂停/重新加载配置
一旦nginx服务起起来,就可以通过如下命令进行控制
nginx -s signal
其中signal的信号
stop--表示快速关闭
quit--优雅地关闭
reload--重新加载配置文件
reopen--重新打开log文件
比如终止工作的线程服务可以使用
nginx -s quit如果改变配置文件则需要
nginx -s reload命令执行之后才能生效,一旦主线程收到这个命令,它就会检查新的配置文件的语法是否正确,然后让配置生效。如果成功之后,主线程会新开一个工作进程,然后发送消息通知旧的工作进程,要求旧的进程停止。
同时也可以发送一些unix命令给nginx服务器,比如kill。这个例子中,信号直接通过给定的进程ID发送给进程。默认情况下nginx服务器的nginx.id在/usr/local/nginx/logs或者/var/run目录下。如果主线程的ID是1628,那么可以直接发送QUIT命令让主线程停止。
kill -s QUIT 16286. 配置文件的结构
nginx各个模块都是通过指定的配置文件进行控制的。
指令可以是单独的指令,也可以是块指令,单独的指令相当于一条语句,包含指令的名称,和参数之间通过空格断开,指令的最后用分号结束。块指令和单独的指令有相同的语法结构,除了块指令是用一系列的{}来表示结尾。块指令里面的指令称之为内容,比如(events, http, server location).
在配置文件中,如果指令在所有的指令之外称这个指令为主指令,events 和http就是主指令,server在http之内,locaton在server之内。
其余的以#开头的指令都是注释的内容。
7. 静态内容服务
服务器的一个重要功能就是静态网络服务比如图片和静态的html网页。下面是一个实例,取决于需求,文件可以放置在不同的目录中,比如/data/www/(包含着html文件)以及/data/images/(包含图片)。这需要编辑配置文件,在http指令中包含server指令然后包含两个location位置。
第一步是创建一个sample.html的网页文件放到/dada/www目录中,然后在/data/images/目录中放置一些图片
下面是一个最简单的html示例
<html><head></head>接下来是打开配置文件,默认的配置文件已经有些服务器指令实例,绝大部分都需要注释掉它们。
<body>hello</body>
</html>
先注释掉所有的指令,写上如下指令块
按照刚刚解释的内容
http {通常来说配置文件可以很多的server块指令,每个server都是通过监听的端口号区别开。一旦nginx决定是哪个server处理请求,它就会打开location中的相对应的文件夹来获取URI指定的内容。
server {
}
}
在location块指令中增加如下内容
location / {
root /data/www;
}
这个位置会和前面的指定的URI相比对,URI会加上root指令内的路径,也就是/data/www,去组成需要文件的路径。如果这里有好几个同时满足location位置的路径,location会提供最短路径的那个,如果其它的路径都不能够提供相对应的文件。
现在增加第二个locaiton指令
location /images/ {它需要请求路径中包含/images/,前面说道的 / 也是满足要求的,在这个路径不满足的情况下,会使用 / 路径。
root /data;
}
下面是一个完整的html配置文件
http {
server / {
root /data/www;
}
server /images/ {
root /data;
}
}
这个配置文件会监听标准的80端口,可以通过http://localhost/进行访问。如果一个URI请求以/images/开头,那么这个server指令就会发送/data/images目录下的文件,比如回应http://localhost/images/example.png,nginx服务器会发送/data/images/example.png文件。如果这个文件不存在,nginx会提醒404错误。不是以/images开头的URI请求会被映射到/data/www目录中。比如URI地址是http://localhost/some/examples.html,服务器会发送/data/www/some/examples.html文件。
需要配置重新生效,需要执行下面的指令
nginx -s reload
在一些条件下服务器可能没有像上述描述的工作,你可以检查access.log或者error.log文件,通常是在/usr/local/nginx/logs/或者/var/log/nginx目录下。
8. 建立简单的代理服务器(proxy server)
nginx服务起还有一个经常被使用的用途是当做代理服务器,代理服务器的意思是指一个服务起接收到请求,然后把这个请求传递给受理服务器(proxied servers)处理,然后从受理服务器中得到相应的回应发送给请求对象。如果不清楚的可以查阅简单的书籍很快就能明白这句话什么意思。
下面会配置一个基本的代理服务器,这个服务器的作用是对于图片请求会直接在本地进行处理,其它的请求都会发送个给受理服务器进行处理。在这个例子中,两个server都定义在一个nginx实例中。
首先,定义一个受理服务器,在nginx配置文件中加入一个server块指令
server {
listen 8080;
root /data/up1;
location / {
}
}
这个简单的服务器指令配置监听8080端口(之前的服务器端口没有指定是因为已经默认配置了标准的80端口),对于所有的请求都会用本地的/data/up1目录。
创建这个文件,然后放置一个index.html文件到其中。注意root指令放置在server指令中,在location中没有包含自己的root指令的时候这个server的root指令就会被location指令使用。
下一步使用之前已经学习的服务器配置,修改它让它成为一个代理服务器。在location块指令中,放置一个proxy_pass指令,名字 受理服务器指定的端口号,,这里使用(http://localhost:8080):
server {接着我们修改上面第二个的location块指令,它会把所有/images/前缀的请求映射到服务器的/data/images/目录下,为了是它能够只响应指定文件的请求,需要更改location块指令:
location / {
proxy_pass http://localhost:8080;
}
locaiton /images/ {
root /data;
}
}
location ~ \.(gif|jpg|png)$ {这个参数是一个正则表达式,对应所有的以.gif .jpg .png结尾的URI请求。一个正则表达式应该以~开头。对应的请求会被映射到/data/images目录下。
root /data/images;
}
nginx服务器在处理用户请求的时候,首先会检查有特殊前缀的location指令,记住最长的location指令的前缀,然后再检查正则表达式。如果这里有一个合乎要求的的正则表达式,nginx会选择这个location指令,如果没有则会选择之前的。
下面是一个代理服务器的配置
server {这个服务器会过滤出所有以.gif .jpg .png结尾的请求,然后把它们映射到/data/images目录下(URI地址加上root指令的参数),会把其它的所有的请求发送到上述配置的受理服务器中。
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
为了使新的配置生效,需要发送reload信号给nginx服务器。
9. 设置快速FastCGI代理
nginx可以把请求路由到FastCGI服务器中,FastCGI服务器里可以有各种架构以及使用各种编程语言比如php。
最简单的FastCGI配置是讲proxy_pass指令改成fastcgi_pass指令,fastcgi_param指令将请求传递给FastCGI服务器。假设一个FastCGI服务起可以通过localhost:9000端口访问,以之前配置代理服务器为基础,可以将配置文件写成下面这个样子。
server {这个会将所有的的除了静态图片的请求路由到FastCGI服务器中。
location / {
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}