【Nginx】Nginx安装及反向代理配置

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好

目录

  • 一、安装环境
  • 二、Nginx安装
  • 三、反向代理配置案例
  • 四、配置文件详解
  • 五、参考并致谢

一、安装环境

操作系统:CentOS 7
应用:Nginx 1.6.2

二、Nginx安装

1、yum方式安装
配置yum源

默认情况下CentOS 7是没有Nginx源,需要手动配置

[root@bogon /]# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
安装nginx
[root@bogon /]# yum install -y nginx
启动或关闭nginx
[root@bogon /]# systemctl start nginx.service  -- 启动
[root@bogon /]# systemctl stop nginx.service  -- 关闭  
[root@bogon /]# systemctl enable nginx.service  -- 设置开机启动
验证

启动了nginx服务后,在浏览器中输入你服务器的地址

2、rpm方式安装
下载PCRE包

下载地址:http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz

[root@bogon src]# cd /usr/local/src/
[root@bogon src]# wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
解压并安装PCRE包
[root@bogon src]# tar zxvf pcre-8.35.tar.gz
[root@bogon src]# cd pcre-8.35  
[root@bogon pcre-8.35]# ./configure
[root@bogon pcre-8.35]# make && make install
验证PCRE版本
[root@bogon pcre-8.35]# pcre-config --version
下载nginx
[root@bogon src]# cd /usr/local/src/
[root@bogon src]# wget http://nginx.org/download/nginx-1.6.2.tar.gz
解压并安装
[root@bogon src]# tar zxvf nginx-1.6.2.tar.gz  
[root@bogon src]# cd nginx-1.6.2  
[root@bogon nginx-1.6.2]# ./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35
[root@bogon nginx-1.6.2]# make && make install
验证nginx版本
[root@bogon nginx-1.6.2]# /usr/local/webserver/nginx/sbin/nginx -v
创建nginx运行使用的用户:
[root@bogon conf]# /usr/sbin/groupadd www 
[root@bogon conf]# /usr/sbin/useradd -g www www
修改配置文件
[root@bogon conf]# vim /usr/local/webserver/nginx/conf/nginx.conf

将user一行改为 user www www;


至于其它配置项按需修改(后面给出配置项的意义)

启动及相关命令
[root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx
[root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx -s reload            # 重新载入配置文件
[root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx -s reopen            # 重启 Nginx
[root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx -s stop              # 停止 Nginx
验证

启动了nginx服务后,在浏览器中输入你服务器的地址

三、反向代理配置案例

范例效果:使用nginx反向代理功能,当访问www.catke.com时,直接跳转到本机的127.0.0.1:8080

1、部署tomcat

为了展示效果,我们部署了个tomcat,并启动,在浏览器地址栏中输入:本机IP:8080出现tomcat的主页


2、修改服务器的host
[root@bogon ~]# vim /etc/hosts

在末尾加上192.168.15.204 www.catke.com,其中,192.168.15.204是我的本机IP

此时,打开浏览器,并输入www.catke.com:8080的时候能进入到tomcat的主页

3、修改nginx配置文件

在nginx.conf配置文件中添加如下配置:

server {

    listen       80;

    server_name  www.catke.com;

    location / {

        proxy_pass http://192.168.15.204:8080;

        index  index.html index.htm index.jsp;

    }
}

以上配置的意思是:当访问www.catke.com这个域名时,页面会跳转到http://192.168.15.204:8080这个地址上
然后保存退出,然后重新加载一下配置文件

[root@bogon /]# /usr/local/webserver/nginx/sbin/nginx -s reload
4、验证
5、说明和注意

在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。

第一种
location  /proxy/ {

proxy_pass http://127.0.0.1:81/;

}

结论:会被代理到http://127.0.0.1:81/test.html 这个url

第二种
location  /proxy/ {

proxy_pass http://127.0.0.1:81;

}

结论:会被代理到http://127.0.0.1:81/proxy/test.html 这个url

第三种
location  /proxy/ {

proxy_pass http://127.0.0.1:81/ftlynx/;

}

结论:会被代理到http://127.0.0.1:81/ftlynx/test.html 这个url。

第四种
location  /proxy/ {

proxy_pass http://127.0.0.1:81/ftlynx;

}

}
结论:会被代理到http://127.0.0.1:81/ftlynxtest.html 这个url

四、配置文件详解

nginx配置文件结构大致如图所示:

1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
    # 指定nginx进程使用什么用户启动
    user www www;
    # 指定启动多少进程来处理请求,一般情况下设置成CPU的核数。
    worker_processes 4;
    # 在高并发情况下,通过设置将CPU和具体的进程绑定来降低由于多核CPU切换造成的寄存器等现场重建带来的性能损耗。
    worker_cpu_affinity 0001 0010 0100 1000;
    # 定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。
    error_log /data/logs/nginx_error.log crit;
    # 指定进程pid文件的位置。
    pid /usr/local/webserver/nginx/nginx.pid;
    # 用于指定一个nginx进程可以打开的最多文件描述符数目,这里是65535,需要使用命令“ulimit -n 65535”来设置。
    worker_rlimit_nofile 65535;
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
events{
    # use是个事件模块指令,用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。
    # 其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。
    # 对于Linux系统,epoll工作模式是首选。在操作系统不支持这些高效模型时才使用select。
    use epoll;
    # 每一个worker进程能并发处理的最大连接数
    worker_connections     1024;
}
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
http{
    # include是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度。
    include       mime.types;
    # default_type属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式。
    default_type  application/octet-stream;
    # 等待client发送一个请求头的超时时间,超时后,nginx返回HTTP状态码408(“Request timed out”)
    client_header_timeout 120s;
    # 设置请求体的读超时时间
    client_body_timeout 120s;
    #  允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值。
    client_max_body_size 100m;
    # 开启高效文件传输模式。
    # 对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
    sendfile on;
    # 长连接超时时间,单位是秒。
    keepalive_timeout 65 :
    
    # 开启gzip压缩
    gzip on;
    # 最小压缩文件大小
    gzip_min_length 1k;
    #  压缩缓冲区
    gzip_buffers    4 16k;
    # 用于设置识别HTTP协议版本
    gzip_http_version 1.1;
    # 压缩等级
    gzip_comp_level 6;
    # 压缩类型
    gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    # vary header支持,该选项可以让前端的缓存服务器缓存经过GZIP压缩的页面。
    gzip_vary on;
    
    # Nginx本身不支持PHP等语言,但是它可以通过FastCGI来将请求扔给某些语言或框架处理
    # FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度
    fastcgi_connect_timeout 300;  
    fastcgi_send_timeout 300;  
    fastcgi_read_timeout 300;  
    fastcgi_buffer_size 64k;  
    fastcgi_buffers 4 64k;  
    fastcgi_busy_buffers_size 128k;  
    fastcgi_temp_file_write_size 128k;  
    fastcgi_cache TEST;  
    fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;  
    fastcgi_cache_valid 200 302 1h;  
    fastcgi_cache_valid 301 1d;  
    fastcgi_cache_valid any 1m; 

    # 限流配置
    # $binary_remote_addr(NGINX变量),该变量代表了某个客户端IP地址的二进制形式。
    # zone=关键字标识的区域名称,冒号后面的表示内存区域的大小
    # rate表示允许相同标识的客户端的访问频次
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
    server {
        ...
        location /login/ {
            # burst 设置缓冲区大小,当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内
            # nodelay 允许请求在排队的时候就立即被处理
            limit_req zone=mylimit burst=20 nodelay;
            ...
        }
    }

    # 缓存配置
    # proxy_cache_path 设置缓存的路径和配置
    # levels 目录的层次结构
    # keys_zone 设置一个共享内存区
    # max_size 缓存的上限
    # inactive指定了项目在不被访问的情况下能够在内存中保持的时间
    # use_temp_path 将写入缓存的文件先放入一个临时存储区域
    proxy_cache_path /data/app/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
    server {
        ...
        location /article/ {
            # 匹配缓存
            proxy_cache my_cache;
            ...
        }
    }
}
4、upstream块:配置负载均衡
# 有五种配置方式
# 1、轮询
upstream  backend  { 
    server   192.168.1.1:8080;
    server   192.168.1.2:8080;
}
# 2、weight
upstream  backend  { 
    server   192.168.1.1:8080 weight=1;
    server   192.168.1.2:8080 weight=2;
}
# 3、ip_hash 按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配
upstream  backend  { 
    ip_hash;
    server   192.168.1.1:8080;
    server   192.168.1.2:8080;
}
# 4、fair 响应时间短即rt小的后端服务器优先分配请求
upstream  backend  { 
    server   192.168.1.1:8080;
    server   192.168.1.2:8080;
    fair;
}
# 5、url_hash 按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器
upstream  backend  { 
    server   192.168.1.1:8080;
    server   192.168.1.2:8080;
    hash $request_uri;
    hash_method crc32;
}

# upstream中server指令语法如下:

server address [parameters]
# parameters是可选参数,可以是如下参数:
# 1、down:表示当前server已停用
# 2、backup:表示当前server是备用服务器,只有其它非backup后端服务器都挂掉了或者很忙才会分配到请求。
# 3、weight:表示当前server负载权重,权重越大被请求几率越大。默认是1.
# 4、max_fails和fail_timeout一般会关联使用,如果某台server在fail_timeout时间内出现了max_fails次连接失败,
# 那么Nginx会认为其已经挂掉了,从而在fail_timeout时间内不再去请求它,fail_timeout默认是10s,max_fails默认是1,
# 即默认情况是只要发生错误就认为服务器挂掉了,如果将max_fails设置为0,则表示取消这项检查。
5、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
# 监听端口
listen 80;
# 服务器名,可以通过正则匹配
server_name blog.lazyrabbit.xyz;
# 定义服务器的默认网站根目录位置
root /data/htdocs/www;
# 定义路径下默认访问的文件名
index index.html index.htm index.php;
6、location块:配置请求的路由,以及各种页面的处理情况。
# location匹配规则
# = 精确匹配,如果找到匹配=号的内容,立即停止搜索,并立即处理请求(优先级最高)
# ~ 区分大小写
# ~* 不区分大小写
# ^~ 只匹配字符串,不匹配正则表达式

location / {
    # 代理转发
    proxy_pass http://backend;
    # 是将代理服务器收到的用户的信息传到真实服务器上
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    #允许访问的ip
    allow   219.237.222.30;
    #禁止其他ip访问
    deny    all; 
}
# 实现动静分离
location /img/ {
    proxy_pass http://backend;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    #客户端缓存30天
    expires      30d;
}
location ~ .*\.(js|css)?$ {
    expires      1h;
}
7、参考配置,包括反向代理,动静分离,负载均衡,缓存,限流
worker_processes  1;
error_log  logs/error.log;
events {
    use epoll;
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    client_header_timeout 120s;
    client_body_timeout 120s;
    # 限制上传文件大小
    client_max_body_size 100m;
    # 开启gzip压缩
    gzip on;
    gzip_min_length 1k;
    gzip_buffers    4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    gzip_vary on;

    # 负载均衡
    upstream blog{
        server 123.123.123.123:8080;
        server 123.123.123.123:8081;
    }

    # 限流配置
    # $binary_remote_addr(NGINX变量),该变量代表了某个客户端IP地址的二进制形式。
    # zone=关键字标识的区域名称,冒号后面的表示内存区域的大小
    # rate表示允许相同标识的客户端的访问频次
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;

    # 静态html服务器
    server {
        listen       80;
        server_name  www.lazyrabbit.xyz lazyrabbit.xyz;
        root html/home;
        index index.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    # 反向代理服务器
    server {
        listen       80;
        # 配置二级域名
        server_name  blog.lazyrabbit.xyz;

        location / {
            proxy_pass http://blog;
            # 将代理服务器收到的用户的信息传到真实服务器上
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        # login限流
        location /login/ {
            limit_req zone=mylimit burst=20 nodelay;
            proxy_pass http://blog;
            # 是将代理服务器收到的用户的信息传到真实服务器上
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        # 动静分离
        location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)${   
            root /data/app/nginx/;
            # 浏览器缓存
            expires      7d; 
        }
        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
8、全局变量
$args:这个变量等于请求行中的参数,同$query_string。
$is_args: 如果已经设置$args,则该变量的值为"?",否则为""。
$content_length: 请求头中的Content-length字段。
$content_type: 请求头中的Content-Type字段。
$document_uri: 与$uri相同。
$document_root: 当前请求在root指令中指定的值。
$host: 请求主机头字段,否则为服务器名称。
$http_user_agent: 客户端agent信息。
$http_cookie: 客户端cookie信息。
$limit_rate: 这个变量可以限制连接速率。
$request_method: 客户端请求的动作,通常为GET或POST。
$remote_addr: 客户端的IP地址。
$remote_port: 客户端的端口。
$remote_user: 已经经过Auth Basic Module验证的用户名。
$request_body_file`: 客户端请求主体的临时文件名。
$request_uri: 请求的URI,带参数
$request_filename: 当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme: 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;。
$server_protocol: 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr: 服务器地址,在完成一次系统调用后可以确定这个值。
$server_name: 服务器名称。
$server_port: 请求到达服务器的端口号。
$request_uri: 包含请求参数的原始URI,不包含主机名,如:/foo/bar.php?arg=baz。
$uri: 不带请求参数的当前URI,$uri不包含主机名,如/foo/bar.html可能和最初的值有不同,比如经过重定向之类的。

五、参考并致谢

https://www.php.cn/nginx/436475.html

https://www.jianshu.com/p/e1be6535a2d2

https://www.runoob.com/linux/nginx-install-setup.html

https://www.cnblogs.com/songxingzhu/p/8568432.html

https://www.cnblogs.com/ysocean/p/9392908.html

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

推荐阅读更多精彩内容