nginx 基础+进阶

更新日志:
20170818 更新yum安装 和 多前端部署80端口

截图目录:


image.png

image.png

[toc]

nginx(基础)

准备环境 centos 6.8

[toc]

yum 安装(简单速度快)

nginx 下载:https://nginx.org/en/download.html

选择编译好的版本,通过源安装。


RHEL/CentOS:

vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/
gpgcheck=0
enabled=1

但是需要修改一下 OS 和 OSRELEASE,根据实际情况修改后的,我是 centos6的如下:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1

查看 yum 的 nginx 版本:

[root@host ~]# yum list |grep nginx
nginx.x86_64                                1.12.1-1.el6.ngx            @nginx
nginx-debug.x86_64                          1.8.0-1.el6.ngx             nginx
nginx-debuginfo.x86_64                      1.12.1-1.el6.ngx            nginx
nginx-module-geoip.x86_64                   1.12.1-1.el6.ngx            nginx
nginx-module-geoip-debuginfo.x86_64         1.12.1-1.el6.ngx            nginx
nginx-module-image-filter.x86_64            1.12.1-1.el6.ngx            nginx
nginx-module-image-filter-debuginfo.x86_64  1.12.1-1.el6.ngx            nginx
nginx-module-njs.x86_64                     1.12.1.0.1.10-1.el6.ngx     nginx
nginx-module-njs-debuginfo.x86_64           1.12.1.0.1.10-1.el6.ngx     nginx
nginx-module-perl.x86_64                    1.12.1-1.el6.ngx            nginx
nginx-module-perl-debuginfo.x86_64          1.12.1-1.el6.ngx            nginx
nginx-module-xslt.x86_64                    1.12.1-1.el6.ngx            nginx
nginx-module-xslt-debuginfo.x86_64          1.12.1-1.el6.ngx            nginx
nginx-nr-agent.noarch                       2.0.0-12.el6.ngx            nginx
pcp-pmda-nginx.x86_64                       3.10.9-9.el6                base

其他os 版本可以查看https://nginx.org/en/linux_packages.html#stable

安装

yum -y install nginx

查看 nginx 的安装目录:

[root@host ~]# rpm -ql nginx
/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/mime.types
/etc/nginx/modules
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/etc/nginx/win-utf
/etc/rc.d/init.d/nginx
/etc/rc.d/init.d/nginx-debug
/etc/sysconfig/nginx
/etc/sysconfig/nginx-debug
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/sbin/nginx
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.12.1
/usr/share/doc/nginx-1.12.1/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx
/var/log/nginx


多前端项目配置

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    location /tz {
        if (-d $request_filename) {
          rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
        }
        alias  /usr/local/ServerStatus/web/;
        index  index.html index.htm;
    }
。。。
。。。

拦截指定请求:

location /tz {
   if (-d $request_filename) {
     rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
   }
   alias  /usr/local/ServerStatus/web/;
   index  index.html index.htm;
}

location /tz 会拦截/tz/tz/,如果 location /tz/ 只会拦截/tz/
使用正则表达式也行。

访问路径最后的斜线问题:

if (-d $request_filename) {
    rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}

是自动在请求地址后面加上 /,例如:http://inke.cf/tz 变为 http://inke.cf/tz/,如果有端口号的话(端口不是80),需要改为下面的代码:

if (-d $request_filename) {
    rewrite ^/(.*)([^/])$ http://$http_host/$1$2/ permanent;
}

总计解决方案:
直接在nginx.conf中修改

optimize_server_names off;#优化服务器名称:关 (默认开启)
server_name_in_redirect off;#服务器名称重定向:关(默认开启)



源码编译方式安装(复杂时间长)

下载nginx:官方网站
使用的最新版本是1.12.0版本。

安装gcc

需要安装gcc的环境。

yum install gcc-c++

第三方的开发包。

PCRE

PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。

yum install -y pcre pcre-devel

注:pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。

zlib

zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。

yum install -y zlib zlib-devel

openssl

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。

yum install -y openssl openssl-devel

一次性安装所有环境:

yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel



安装步骤

会执行以下指令:


第一步:源码上传

把nginx的源码包上传到linux系统,或者直接使用linux系统下载 nginx 的源码包。

第二步:解压缩

tar zxf nginx-1.12.0.tar.gz

第三步:使用configure命令创建一makeFile文件。

进入文件目录:

cd nginx-1.12.0

复制一下内容到终端上,执行以下命令:

./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
注意:

启动nginx之前,上边将临时文件目录指定为/var/temp/nginx,需要在/var下创建temp及nginx目录

mkdir /var/temp/nginx/client -p

第四步:make

make

第五步:make install

make install

因为上面指定了安装位置:/usr/local/nginx,所以进入到改目录下,可以看到安装后的一些文件。



使用技巧

启动nginx

进入sbin目录

cd /usr/local/nginx/sbin
./nginx

可以查询下是否启动ps aux|grep nginx,也可以直接访问80端口的 ip。

注意:是否关闭防火墙

关闭nginx:

./nginx -s stop

推荐使用:

./nginx -s quit

重启nginx:

先关闭后启动,会刷新配置文件:

./nginx -s reload

配置虚拟主机

就是在一台服务器启动多个网站。

  • 如何区分不同的网站:
    • 域名不同
    • 端口不同

通过端口区分不同虚拟机

Nginx的配置文件:/usr/local/nginx/conf/nginx.conf
文件内容:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

配置一个虚拟主机

一个server节点就是一个虚拟主机(默认有一个80端口的,nginx 的介绍页)

server {
   listen       80;
   server_name  localhost;

   #charset koi8-r;

   #access_log  logs/host.access.log  main;

   location / {
       root   html; # Html是nginx安装目录下的html目录
       index  index.html index.htm; # html目录下的几个 html 文件
   }
}

配置多个虚拟主机

可以配置多个server,配置了多个虚拟主机。

...

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   html;
        index  index.html index.htm;
    }
}
server {
    listen       81;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   html-81;
        index  index.html index.htm;
    }
}

...

通过域名区分虚拟主机

域名是什么?
例如:

www.baidu.com
www.taobao.com
www.jd.com

一级域名:

baidu.com
taobao.com
jd.com

二级域名:

www.baidu.com

Image.baidu.com
Item.baidu.com

三级域名:

Image.baidu.com
Aaa.image.baidu.com

Dns服务器:把域名解析为ip地址。保存的就是域名和ip的映射关系。

注意:

一个域名对应一个ip地址,一个ip地址可以被多个域名绑定。

配置多个虚拟主机

server {
    listen       80;
    server_name  www.taobao.com;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   html-taobao;
        index  index.html index.htm;
    }
}
server {
    listen       80;
    server_name  www.baidu.com;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   html-baidu;
        index  index.html index.htm;
    }
}

本地测试

可以修改hosts文件,修改window的hosts文件:(C:\Windows\System32\drivers\etc)
可以配置域名和ip的映射关系,如果hosts文件中配置了域名和ip的对应关系,不需要走dns服务器。

域名的配置:ip 是自己服务器的 ip或虚拟机的 ip
192.168.18.130 www.taobao.com
192.168.18.130 www.baidu.com

通过访问路径区分不同目录(未实际测试,待验证)

相同 ip 相同 port 配置多前端

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    #匹配:本地后台请求 ip
    upstream redwood_server{
        server 127.0.0.1:8080;
    }

    #imooc:sell后台请求 ip
    upstream sell_server{
        server 127.0.0.1:8080;
    }

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #匹配:设置变量redwood 指向 匹配前端项目路径
        set $redwoodUI /Users/inke/ws/javaee/redwood/src/;

        #imooc:sell 前端项目路径
        set $sellUI /Users/inke/ws/javaee/imooc/sell_html/;

        # 访问根路径,那么会访问 nginx welcome 界面
        location / {
            root   html;
            index  index.html index.htm;
        }

        #匹配:前端 index 界面
        location /redwoodUI {
            if (-d $request_filename) {
                rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
            }
            alias   $redwoodUI;
            index  index.html index.htm;
        }

        #imooc:sell index 界面
        location /sellUI {
            if (-d $request_filename) {
                rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
            }
            alias   $sellUI;
            index  index.html index.htm;
        }

        #匹配:反向代理
        location /auth{
            proxy_pass http://redwood_server$request_uri;
        }

        #imooc:sell 反向代理
        location /sell{
            proxy_pass http://sell_server$request_uri;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    include servers/*;
}



Mac 安装教程

准备环境

MacOS Sierra 10.12.5

安装指令:

brew install nginx

安装日志:

==> Installing dependencies for nginx: pcre, openssl@1.1
==> Installing nginx dependency: pcre
==> Downloading https://homebrew.bintray.com/bottles/pcre-8.40.sierra.bottle.tar
######################################################################## 100.0%
==> Pouring pcre-8.40.sierra.bottle.tar.gz
==> Using the sandbox
🍺  /usr/local/Cellar/pcre/8.40: 204 files, 5.4MB
==> Installing nginx dependency: openssl@1.1
==> Downloading https://homebrew.bintray.com/bottles/openssl@1.1-1.1.0f.sierra.b
######################################################################## 100.0%
==> Pouring openssl@1.1-1.1.0f.sierra.bottle.tar.gz
==> Caveats
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
  /usr/local/etc/openssl@1.1/certs

and run
  /usr/local/opt/openssl@1.1/bin/c_rehash

This formula is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.

If you need to have this software first in your PATH run:
  echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.zshrc

For compilers to find this software you may need to set:
    LDFLAGS:  -L/usr/local/opt/openssl@1.1/lib
    CPPFLAGS: -I/usr/local/opt/openssl@1.1/include

==> Summary
🍺  /usr/local/Cellar/openssl@1.1/1.1.0f: 6,421 files, 15.5MB
==> Installing nginx
==> Downloading https://homebrew.bintray.com/bottles/nginx-1.12.0_1.sierra.bottl
######################################################################## 100.0%
==> Pouring nginx-1.12.0_1.sierra.bottle.tar.gz
==> Caveats
Docroot is: /usr/local/var/www

The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that
nginx can run without sudo.

nginx will load all files in /usr/local/etc/nginx/servers/.

To have launchd start nginx now and restart at login:
  brew services start nginx
Or, if you don't want/need a background service you can just run:
  nginx
==> Summary
🍺  /usr/local/Cellar/nginx/1.12.0_1: 23 files, 1MB

前台启动:

brew services start nginx

后台运行:

nginx

可以查询下是否启动ps aux|grep nginx,也可以直接访问80端口的 ip。

停止:

nginx -s stop

重启:

nginx -s reload

默认安装位置,修改配置可以在这里修改:

/usr/local/etc/nginx



nginx 反向代理(进阶)

正向代理(针对的是客户端方面):

反向代理(针对的是服务端方面):

反向代理服务器决定哪台服务器提供服务,反向代理服务器不提供服务,也是请求的转发。


Nginx实现反向代理

两个域名指向同一台nginx服务器,用户访问不同的域名显示不同的网页内容。
两个域名是www.sian.com.cnwww.sohu.com
nginx服务器使用虚拟机192.168.18.130

第一步:安装两个tomcat,分别运行在8080和8081端口。

第二步:启动两个tomcat。

第三步:反向代理服务器的配置

...

upstream tomcat1 {
    server 192.168.18.130:8080;
}

server {
    listen       80;
    server_name  www.sina.com.cn;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        proxy_pass   http://tomcat1;
        index  index.html index.htm;
    }
}

upstream tomcat2 {
    server 192.168.18.130:8081;
}

server {
    listen       80;
    server_name  www.sohu.com;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        proxy_pass   http://tomcat2;
        index  index.html index.htm;
    }
}

...

proxy_pass指定转发的网址:http://tomcat2;
upstream tomcat2是配置指定的访问 ip 和 port。
如果是服务器集群,那么直接在upstream的内部直接增加 server 即可。

服务器集群配置多个虚拟主机

例如:

upstream tomcat2 {
    server 192.168.18.130:8081;
    server 192.168.18.131:8080;
    server 192.168.18.132:80;
    server 192.168.18.133:80;
    server 192.168.18.134:80;
}

server {
    listen       80;
    server_name  www.sohu.com;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        proxy_pass   http://tomcat2;
        index  index.html index.htm;
    }
}

第四步:nginx重新加载配置文件

先关闭后启动,会刷新配置文件:

./nginx -s reload

第五步:配置域名

在hosts文件中添加域名和ip的映射关系
192.168.18.130 www.sina.com.cn
192.168.18.130 www.sohu.com



负载均衡

如果一个服务由多条服务器提供,需要把负载分配到不同的服务器处理,需要负载均衡。

upstream tomcat2 {
    server 192.168.25.148:8081;
    server 192.168.25.148:8082;
}

可以根据服务器的实际情况调整服务器权重。
权重越高分配的请求越多,权重越低,请求越少。默认是都是1

upstream tomcat2 {
    server 192.168.25.148:8081;
    server 192.168.25.148:8082 weight=2;
}

Nginx的高可用(了解,运维工作)

要实现nginx的高可用,需要实现备份机。

什么是负载均衡高可用

nginx作为负载均衡器,所有请求都到了nginx,如果nginx服务器宕机后端web服务将无法提供服务,影响严重。
为了屏蔽负载均衡服务器的宕机,需要建立一个备份机。
主服务器和备份机上都运行高可用(High Availability)监控程序,通过传送“心跳信息”来监控对方的运行状况。
当备份机不能在一定的时间内收到这样的信息时,它就接管主服务器的服务IP并继续提供负载均衡服务;
当备份管理器又从主管理器收到“心跳信息”时,它就释放服务IP地址,这样的主服务器就开始再次提供负载均衡服务。

keepalived+nginx实现主备

keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。

如果超过5W并发,那么就需要花钱买硬件负载均衡了,硬件负载均衡+keepalived+nginx
如果没钱那么也可以使用 lvs ,可以达到50% 的硬件负载均衡的性能,组成 lvs+keepalived+nginx



参考:

https://www.geekzu.cn/archives/nginx-directory.html

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

推荐阅读更多精彩内容