一、Linux下安装nginx
nginx安装包下载:https://nginx.org/en/download.html
在安装nginx前首先要确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel(这些都是干什么用的?)
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
(我最开始没有做这步,后面./configure的时候报错 C compiler cc is not found)
# 解压到 ~/nginx
tar -zxvf nginx-1.9.9.tar.gz
# 进入nginx目录
cd nginx-1.9.9
# 生成Makefile文件并指定安装目录 (--help 查看帮助信息 https://nginx.org/en/docs/configure.html)
./configure --prefix=~/nginx
# 编译,安装
make
make install
# 测试是否安装成功
./sbin/nginx -t
#启动nginx
./nginx
#停止nginx
./nginx -s stop (快速关闭)
./nginx -s quit (正常关闭)
#重新加载配置文件
./nginx -s reload
#重新打开日志文件
./nginx -s reopen
启动nginx时报错bind() to 0.0.0.0:80 failed(13: Permission denied) 说明该端口号不可用去nginx.conf修改端口号,这里为8090
启动nginx时报错两个log文件没有权限,发现目录所有者被改成了nobody,原因是我第一次执行nginx -t 操作时用的是root用户,如果执行nginx -t的用户不是nginx目录的所有者,就会强行改变下面临时目录的权限。可通过
chown -R 用户组:组名 文件名
修改目录所有者。
二、nginx.conf配置文件
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况。
6、upstream:指令主要用于负载均衡,设置一系列的后端服务器;
三、提供静态内容
server {
location / {
root /home/xxx/data/html;
index 1.html
}
location /images/ {
root /home/xxx/data;
}
}
如果有多个匹配的location块,nginx将选择前缀最长的块。
四、设置简单的代理服务器
正向代理:客户端要向代理服务器发送一个请求,并指定目标服务器,代理服务器将目标服务器返回的数据转交给客户端。
反向代理:将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
正向代理代理客户端,反向代理代理服务器。
映射到本地系统的/home/xxx/data/html目录
server {
listen 8080;
root /home/xxx/data/html;
location / {
}
}
通过10.16.161.103:8020端口访问10.16.161.104:8090下nginx的资源
http {
server {
listen 8020;
location / {
proxy_pass http://10.16.161.104:8090;
}
location ~ \.(gif|jpeg|jpg|png)$ {
root data/images;
}
}
}
五、使用nginx作为http负载均衡器
四层负载均衡:主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
以TCP为例,负载均衡设备在接收到第一个来自客户端的请求时,通过上述方式选择一个最佳的服务器,并对报文中目标IP地址进行修改(改为后端服务器IP),直接转发给该服务器。TCP的连接建立,即三次握手是客户端和服务器直接建立的,负载均衡设备只是起到一个类似路由器的转发动作。
七层负载均衡,也称为“内容交换”:主要通过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
以TCP为例,负载均衡设备如果要根据真正的应用层内容再选择服务器,只能先代理最终的服务器和客户端建立连接(三次握手)后,才可能接受到客户端发送的真正应用层内容的报文,然后再根据该报文中的特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
1、轮询
根据Nginx配置文件中的顺序,依次把客户端的web请求分发到不同的后端服务器上。
http {
upstream myapp1 {
server 10.16.161.104:8090;
server 10.16.161.103:8090;
server 10.16.161.102:8090;
}
server {
listen 8020;
location / {
proxy_pass http://myapp1;
}
location ~ \.(gif|jpeg|jpg|png)$ {
root data/images;
}
}
}
2、最少连接调度算法
web请求会被转发到连接数最少的服务器上。
http {
upstream myapp1 {
least_conn;
server 10.16.161.104:8090;
server 10.16.161.103:8090;
server 10.16.161.102:8090;
}
server {
listen 8020;
location / {
proxy_pass http://myapp1;
}
location ~ \.(gif|jpeg|jpg|png)$ {
root data/images;
}
}
}
3、权重
把请求更多地分发到高配置的后后端服务器上,把相对较少的请求分发到低配服务器。
http {
upstream myapp1 {
server 10.16.161.104:8090 weight=2;
server 10.16.161.103:8090;
server 10.16.161.102:8090;
}
server {
listen 8020;
location / {
proxy_pass http://myapp1;
}
location ~ \.(gif|jpeg|jpg|png)$ {
root data/images;
}
}
}
4、会话持久性
同一客户端连续的web请求都会被分发到同一个服务器进行处理。
http {
upstream myapp1 {
ip_hash;
server 10.16.161.104:8090;
server 10.16.161.103:8090;
server 10.16.161.102:8090;
}
server {
listen 8020;
location / {
proxy_pass http://myapp1;
}
location ~ \.(gif|jpeg|jpg|png)$ {
root data/images;
}
}
}
其它指令
keepalive:每个worker进程为发送到upstream服务器的连接所缓存的个数;
server:定义一个upstream服务器的地址,还可包括一系列可选参数,如:
weight:权重;
max_fails:最大失败连接次数,失败连接的超时时长由fail_timeout指定;
fail_timeout:等待请求的目标服务器发送响应的时长;
backup:用于fallback的目的,所有服务均故障时才启动此服务器;
down:手动标记其不再处理任何请求;
六、其他配置说明
- listen
1、listen *:80 | *:8080 #监听所有80端口和8080端口
2、listen IP_address:port #监听指定的地址和端口号
3、listen IP_address #监听指定ip地址所有端口
4、listen port #监听该端口的所有IP连接
- server_name
基于名称的虚拟主机配置:
server_name name ...;
1、对于name 来说,可以只有一个名称,也可以有多个名称,中间用空格隔开。而每个名字由两段或者三段组成,每段之间用“.”隔开。server_name 123.com www.123.com
2、可以使用通配符“*”,但通配符只能用在由三段字符组成的首段或者尾端,或者由两端字符组成的尾端。server_name *.123.com www.123.*
3、还可以使用正则表达式,用“~”作为正则表达式字符串的开始标记。server_name ~^www\d+\.123\.com$;
匹配优先规则:
①、准确匹配 server_name
②、通配符在开始时匹配 server_name 成功
③、通配符在结尾时匹配 server_name 成功
④、正则表达式匹配 server_name 成功
基于 IP 地址的虚拟主机配置:
语法结构和基于名称匹配一样,而且不需要考虑通配符和正则表达式的问题。
server_name 10.16.161.103
防止使用未定义的服务器名称处理请求(如果其值与任何服务器名称都不匹配,或者请求根本不包含此标头字段,则nginx会将请求路由到该端口的默认服务器)
server {
listen 80;
server_name ""; #从版本0.8.48开始,这是服务器名称的默认设置,因此server_name ""可以省略
return 444;
}
- location
该指令用于匹配 URLlocation [ = | ~ | ~* | ^~] uri { }
1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~ 标识。
- proxy_pass
该指令用于设置被代理服务器的地址。可以是主机名称、IP地址加端口号的形式。proxy_pass URL;
URL 为被代理服务器的地址,可以包含传输协议、主机名称或IP地址加端口号,URI等。
proxy_pass http://www.123.com/uri;
- index
该指令用于设置网站的默认首页。index filename ...;
后面的文件名称可以有多个,中间用空格隔开。
index index.html index.jsp;