- 1系统环境(使用上一篇文章中的环境安装):
- 1.1准备:
- 1.2所有wget下载的包默认都放在/tmp目录下
- 1.3一、在上面文章中gcc gcc-c++我们已经安装过了,这次可以跳过安装或是使用以下命令安装
- 1.4二、安装PCRE库
- 1.5三、安装SSL库
- 1.6四、安装zlib库存
- 1.7五、安装Nginux1.14.0
- 1.8六、Nginx控制命令
- 1.9七、Web访问是否正常
- 1.10八、配置nginx支持php相关并测试
- 1.11九、使用chkconfig管理nginx,并设置为开机自启动
- 1.12十、以上方法安装之后的相关说明
- 1.1310.1、配置文件位置:
- 1.1410.2、Server:
- 1.1510.3、Localtion
- 1.1610.4、location 匹配规则
- 1.1710.5、静态文件映射
- 1.1810.6、转发
- 1.1910.7、负载均衡
- 2十一、总结
1.系统环境(使用上一篇文章中的环境安装):
# cat /etc/redhat-releaseCentOS Linux release 7.2.1511 (Core) # uname -a Linux c72 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
1.1.准备:
1.2.所有wget下载的包默认都放在/tmp目录下
下载地址:http://nginx.org/en/download.html
包地址:http://101.96.10.64/nginx.org/download/nginx-1.14.0.tar.gz
1.3.一、在上面文章中gcc gcc-c++我们已经安装过了,这次可以跳过安装或是使用以下命令安装
# yum install -y gcc gcc-c++
1.4.二、安装PCRE库
# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.42.tar.gz # tar -xzvf pcre-8.42.tar.gz # cd pcre-8.42 # ./configure && make && make install
如报错:configure: error: You need a C++ compiler for C++ support解决:yum install -y gcc gcc-c++
1.5.三、安装SSL库
# wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz # tar -xzvf openssl-1.1.0h.tar.gz # cd openssl-1.1.0h # ./config && make && make install
1.6.四、安装zlib库存
# wget http://zlib.net/zlib-1.2.11.tar.gz # tar -xzvf zlib-1.2.11.tar.gz # cd zlib-1.2.11 # ./config && make && make install
1.7.五、安装Nginux1.14.0
# wget http://nginx.org/download/nginx-1.14.0.tar.gz # tar -xzvf nginx-1.14.0.tar.gz # cd nginx-1.14.0 # ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre=/tmp/pcre-8.42 # make && make install
(注: –with-http_ssl_module:这个不加的话后面在nginx.conf配置ssl:on后,启动会报nginx:
[emerg] unknown directive "ssl" in /opt/nginx/conf/nginx.conf 异常)
1.8.六、Nginx控制命令
1.8.1. 6.1、启动
# /usr/local/nginx/sbin/nginx # netstat -nultp | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 27061/nginx: master
1.8.2. 6.2、重启
# /usr/local/nginx/sbin/nginx -s reload
1.8.3. 6.3、停止
# /usr/local/nginx/sbin/nginx -s stop [root@c72 nginx-1.14.0]# netstat -nultp | grep nginx [root@c72 nginx-1.14.0]#
1.8.4. 6.4、强制关闭
# pkill nginx
1.8.5. 6.5、测试配置文件是否正常
# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
1.9.七、Web访问是否正常
# ifconfig ens160 ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.20.10.146 netmask 255.255.255.0 broadcast 172.20.10.255 inet6 fe80::20c:29ff:febd:3af prefixlen 64 scopeid 0x20<link> ether 00:0c:29:bd:03:af txqueuelen 1000 (Ethernet) RX packets 44367 bytes 74779674 (71.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 26007 bytes 4245412 (4.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
1.9.1.浏览器访问:http://172.20.10.146,结果显示如下:
1.10.八、配置nginx支持php相关并测试
1.10.1.8.1、创建nginx启动用户
# useradd -u 8004 -M -s /sbin/nologin www
1.10.2.8.2、配置nginx支持php
# vim /usr/local/nginx/conf/nginx.conf
原配置文件:
修改为:
原配置文件:
修改为:
原配置文件:
修改为:$document_root$fastcgi_script_name;
1.10.3.8.3、测试是否成功
# vim /usr/local/nginx/html/php.php
添加如下:
<?php phpinfo(); ?>
# /usr/local/nginx/sbin/nginx -s reload
访问http://172.20.10.146/php.php可以正常访问,支持php成功。
1.11.九、使用chkconfig管理nginx,并设置为开机自启动
1.11.1.9.1、创建启动脚本文件
# vi /etc/init.d/nginx
添加以下脚本:
#! /bin/bash # chkconfig: 35 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse set -e PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DESC="nginx daemon" NAME=nginx DAEMON=/usr/local/nginx/sbin/$NAME SCRIPTNAME=/etc/init.d/$NAME test -x $DAEMON || exit 0 d_start(){ $DAEMON || echo -n " already running" } d_stop() { $DAEMON -s quit || echo -n " not running" } d_reload() { $DAEMON -s reload || echo -n " counld not reload" } case "$1" in start) echo -n "Starting $DESC:$NAME" d_start echo "." ;; stop) echo -n "Stopping $DESC:$NAME" d_stop echo "." ;; reload) echo -n "Reloading $DESC configuration..." d_reload echo "reloaded." ;; restart) echo -n "Restarting $DESC: $NAME" d_stop sleep 2 d_start echo "." ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&2 exit 3 ;; esac exit 0
然后保存退出
1.11.2.9.2、修改nginx文件权限
# chmod 755 /etc/init.d/nginx
1.11.3.9.3、将nginx添加到chkconfig管理,并验证是否添加成功
# chkconfig --add nginx
将nginx添加到chkconfig管理
然后可以使用以下命令查看是否添加成功
# chkconfig 注意:该输出结果只显示 SysV 服务,并不包含原生 systemd 服务。SysV 配置数据可能被原生 systemd 配置覆盖。 如果您想列出 systemd 服务,请执行 'systemctl list-unit-files'。 欲查看对特定 target 启用的服务请执行 'systemctl list-dependencies [target]'。 netconsole 0:关 1:关 2:关 3:关 4:关 5:关 6:关 network 0:关 1:关 2:开 3:开 4:开 5:开 6:关 nginx 0:关 1:关 2:关 3:开 4:关 5:开 6:关
1.11.4.9.4、将nginx设置为开机自启动并验证
# chkconfig nginx on # chkconfig 注意:该输出结果只显示 SysV 服务,并不包含原生 systemd 服务。SysV 配置数据可能被原生 systemd 配置覆盖。 如果您想列出 systemd 服务,请执行 'systemctl list-unit-files'。 欲查看对特定 target 启用的服务请执行 'systemctl list-dependencies [target]'。 netconsole 0:关 1:关 2:关 3:关 4:关 5:关 6:关 network 0:关 1:关 2:开 3:开 4:开 5:开 6:关 nginx 0:关 1:关 2:开 3:开 4:开 5:开 6:关
经过以上方法就可以使用"service 服务名 控制命令"或"systemctl 控制命令 服务名"来控制nginx了
例1:
# service nginx start
例2:
# systemctl status nginx
1.12.十、以上方法安装之后的相关说明
1.13.10.1、配置文件位置:
# ll /usr/local/nginx/conf/nginx.conf -rw-r--r-- 1 root root 2656 6月 30 23:44 /usr/local/nginx/conf/nginx.conf
Nginx配置文件常见结构的从外到内依次是「http」「server」「location」等等,
缺省的继承关系是从外到内,也就是说内层块会自动获取外层块的值作为缺省值。
1.14.10.2、Server:
接收请求的服务器需要将不同的请求按规则转发到不同的后端服务器上,在 nginx 中我们可以通过构建虚拟主机(server)的概念来将这些不同的服务配置隔离。
-
server {
-
listen 80;
-
server_name localhost;
-
root html;
-
index index.html index.htm;
-
}
例如我们笔戈玩下的两个子项目 passport 和 wan 就可以通过在 nginx 的配置文件中配置两个 server,servername 分别为 passport.bigertech.com 和 wan.bigertech.com。这样的话不同的 url 请求就会对应到 nginx 相应的设置,转发到不同的后端服务器上。
这里的 listen 指监听端口,server_name 用来指定IP或域名,多个域名对应统一规则可以空格分开,index 用于设定访问的默认首页地址,root 指令用于指定虚拟主机的网页跟目录,这个地方可以是相对地址也可以是绝对地址。
通常情况下我们可以在 nginx.conf 中配置多个server,对不同的请求进行设置。就像这样:
-
server {
-
listen 80;
-
server_name host1;
-
root html;
-
index index.html
-
index.htm;
-
}
-
server {
-
listen 80;
-
server_name host2;
-
root /data/www/html;
-
index index.html index.htm;
-
}
但是当 server 超过2个时,建议将不同对虚拟主机的配置放在另一个文件中,然后通过在主配置文件 nginx.conf 加上 include 指令包含进来。更便于管理。
-
include vhosts/*.conf;
就可以把vhosts的文件都包含进去啦。
1.15.10.3、Localtion
每个 url 请求都会对应的一个服务,nginx 进行处理转发或者是本地的一个文件路径,或者是其他服务器的一个服务路径。而这个路径的匹配是通过 location 来进行的。我们可以将 server 当做对应一个域名进行的配置,而 location 是在一个域名下对更精细的路径进行配置。
以上面的例子,可以将root和index指令放到一个location中,那么只有在匹配到这个location时才会访问root后的内容:
-
location / {
-
-
root /data/www/host2;
-
index index.html index.htm;
-
}
1.16.10.4、location 匹配规则
~ 波浪线表示执行一个正则匹配,区分大小写
~* 表示执行一个正则匹配,不区分大小写
^~ ^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
= 进行普通字符精确匹配
1.16.1.匹配例子:
location = / {
# 只匹配"/". [ configuration A ]
}
location / {
# 匹配任何请求,因为所有请求都是以"/"开始 # 但是更长字符匹配或 者正则表达式匹配会优先匹配 [ configuration B ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 开始的请求,并停止匹配 其它
location [ configuration C ]
}
location ~* .(gif|jpg|jpeg)$ {
# 匹配以 gif, jpg, or jpeg结尾的请求.
# 但是所有 /images/ 目录的请求将由 [Configuration C]处理.
[ configuration D ]
}
请求:/ -> 符合configuration A
/documents/document.html -> 符合configuration B
/images/1.gif -> 符合configuration C
/documents/1.jpg ->符合 configuration D
1.17.10.5、静态文件映射
访问文件的配置主要有 root 和 aliasp’s 两个指令。这两个指令的区别容易弄混:
alias
alias后跟的指定目录是准确的,并且末尾必须加 /。
-
location /c/ {
-
alias /a/;
-
}
root
root后跟的指定目录是上级目录,并且该上级目录下要含有和location后指定名称的同名目录才行。
-
location /c/ {
-
root /a/;
-
}
如果你需要将这个目录展开,在这个location的末尾加上「autoindex on; 」就可以了
1.18.10.6、转发
配置起来很简单比如我要将所有的请求到转移到真正提供服务的一台机器的 8001 端口,只要这样:
-
location / {
-
proxy_pass 172.16.1.1:8001;
-
}
这样访问host时,就都被转发到 172.16.1.1的8001端口去了。
1.19.10.7、负载均衡
-
upstream myserver; {
-
ip_hash;
-
server 172.16.1.1:8001;
-
server 172.16.1.2:8002;
-
server 172.16.1.3;
-
server 172.16.1.4;
-
}
-
location / {
-
proxy_pass http://myserver;
-
}
我们在 upstream 中指定了一组机器,并将这个组命名为 myserver,这样在 proxypass 中只要将请求转移到 myserver 这个 upstream 中我们就实现了在四台机器的反向代理加负载均衡。其中的 ip_hash 指明了我们均衡的方式是按照用户的 ip 地址进行分配。另外还有轮询、指定权重轮询、fair、url_hash几种调度算法。
2.十一、总结
以上是最简单的通过 nginx 实现静态文件转发、反向代理和负载均衡的配置。在 nginx 中所有的功能都是通过模块来实现的,比如当我们配置 upstream 时是用 upstream 模块,而 server 和 location 是在 http core 模块,其他的还有流控的 limt 模块,邮件的 mail 模块,https 的 ssl 模块。他们的配置都是类似的可以再 nginx 的模块文档中找到详细的配置说明。