Nginx在Linux系统中的安装和启动
1)下载nginx-1.14.2.tar.gz的源代码文件:wget http://nginx.org/download/nginx-1.14.2.tar.gz
2)安装前的准备
Nginx的安装需要确定Linux安装相关的几个库,否则配置和编译会出现错误, 具体的检查安装过程为:
gcc编译器是否安装
检查是否安装:yum list installed | grep gcc
执行安装:yum install gcc -y
openssl库是否安装
检查是否安装:yum list installed | grep openssl
执行安装:yum install openssl openssl-devel -y
pcre库是否安装
检查是否安装:yum list installed | grep pcre
执行安装:yum install pcre pcre-devel -y
zlib库是否安装
检查是否安装:yum list installed | grep zlib
执行安装:yum install zlib zlib-devel -y
一次性安装上面的所有软件,执行如下命令
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
3)正式安装
解压下载下来的nginx文件,执行命令:tar -zxvf nginx-1.14.2.tar.gz
切换至解压后的nginx主目录,执行命令:cd nginx-1.14.2
在nginx主目录nginx-1.14.2下执行命令:./configure --prefix=/usr/local/nginx (其中--prefix是指定nginx安装路径) 注意:等号左右不要有空格
执行命令进行编译:make
执行命令进行安装:make install
4)检查是否安装成,切换到/usr/local/nginx目录下,查看内容:
5)启动命令,切换到Nginx安装目录的sbin目录下:
(1).普通启动执行:./nginx
(2).通过配置文件启动:./nginx -c /usr/local/nginx/conf/nginx.conf 或者 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf(通过配置文件启动可以在一台服务器上启动多个Nginx)
(3).检查Nginx是否启动:ps -ef | grep nginx
(4).快速关闭Nginx:
找出nginx的进程号:ps -ef | grep nginx
执行 : kill -TERM pid(其中pid是主进程号的pid) 或者 ./nginx -s stop
(5).重启Nginx:./nginx -s reload
(6).Linux上查看nginx版本:/usr/local/nginx/sbin/nginx -V
-v (小写的v)显示 nginx 的版本
-V (大写的V)显示 nginx 的版本、编译器版本和配置参数
配置文件说明
worker_processes 1; #配置worker进程的连接个数,也就是工作进程数目,根据硬件调整,通常等于CPU数量或者2倍于CPU数量
#配置全局错误日志及类型,[debug | info | notice | warn | error | crit],默认是error
error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;
pid logs/nginx.pid; #配置进程pid文件
events {# 事件区块开始
worker_connections 1024; #配置每个worker进程连接数上限,取值上线65535
#nginx支持的总连接数就等于worker_processes * worker_connections
}# 事件区块结束
http {# HTTP区块开始, # 表示一个支持http请求的http服务器
include mime.types; # Nginx支持的媒体类型库文件,可以在conf/mime.types查看支持哪些多媒体类型
default_type application/octet-stream; #默认文件类型 流类型,可以理解为支持任意类型
#如果你的文件类型在mime.types没有,以默认流的方式返回;
#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;#配置access.log日志及存放路径,并使用上面定义的main日志格式
#如果把这个打开,需要把上面的日志格式打开,你每访问一次http后就会以上面的格式记录一条日志 (一般不管)
sendfile on; # 开启高效传输模式
tcp_nopush on; #防止网络阻塞,上线时通常打开
keepalive_timeout 65; # 长连接超时时间,单位是秒
gzip on; #开启gzip压缩输出 无论我么是请求还是访问,都是以IO流的方式进行传递的,响应数据的时候也是以IO流的方式传递的;
#打开这个可以减少流的大小,增加访问速度(上线一般打开)
upstream www.myweb.com { # upstream是配置nginx与后端服务器负载均衡非常重要的一个模块
server 127.0.0.1:9100 weight=3; #其中weight=1表示权重,访问比率约等于权重之比,权重越大访问机会越多
server 127.0.0.1:9200 weight=1;
}
server { # 第一个Server区块开始,表示一个独立的虚拟主机站点
listen 80; # 提供服务的端口,默认80
server_name localhost;
# 提供服务的域名主机名(凡是域名为localhost的将有这个server块提供服务)
charset koi8-r; #配置字符集 系统默认UTF-8,所以这个不用打开
access_log logs/host.access.log main; #配置本虚拟主机的访问日志,只有访问这个server才可以进行日志输出
location /myweb {
proxy_pass http://www.myweb.com; #上面的“upstream”对应
}
location / { #配置静态资源拦截 "/"表示请求资源的根路径
root html; #root是配置服务器的默认网站根目录位置,默认为nginx安装主目录下的html目录
index index.html index.htm; # 默认的首页文件,多个用空格分开
#也就是访问“/”时它会到“html”目录下找 “index.html”或者“index.htm”文件
}
#error_page 500 502 503 504 /50x.html; # 配置50x错误页面,出现对应的http状态码时,使用50x.html回应客户
#error_page 404 /404.html; #配置404页面
location = /50x.html { #精确匹配
50x.html
root html; # 指定对应的站点目录为html
}
}
}
配置文件中location的语法
Location 配置演示
(1).=精确匹配:location = / { #规则 }
则匹配到 `http://www.example.com/` 这种请求。
(2).~大小写敏感:location ~ /Example/ { #规则 }
请求示例:
http://www.example.com/Example/ [成功]
http://www.example.com/example/ [失败]
(3).~*大小写忽略:location ~* /Example/ { #规则 } :
则会忽略 uri 部分的大小写
http://www.example.com/Example/ [成功]
http://www.example.com/example/ [成功]
(4).^~只匹配以 uri 开头:location ^~ /img/ { #规则 }
以 /img/ 开头的请求,都会匹配上
http://www.example.com/img/a.jpg [成功]
http://www.example.com/img/b.mp4 [成功]
(5).@nginx内部跳转location /img/ { error_page 404 @img_err; } location @img_err { # 规则 }
以 /img/ 开头的请求,如果链接的状态为 404。则会匹配到 @img_err 这条规则上。
location语法中的proxy_pass带不带斜杠的问题:
(1).对于不带斜杠的URI方式,nginx将会保留location中路径部分,比如:
location /api1/ {
proxy_pass http://localhost:8080;
}
在访问http://localhost/api1/xxx时,会代理到http://localhost:8080/api1/xxx
(2).对于带斜杠的URI方式
location /api2/ {
proxy_pass http://localhost:8080/;
}
当访问http://localhost/api2/xxx时,http://localhost/api2/被替换成了http://localhost:8080/,然后再加上剩下的xxx,于是变成了http://localhost:8080/xxx。
location /api5/ {
proxy_pass http://localhost:8080/haha;
}
当访问http://localhost/api5/xxx时,http://localhost/api5/被替换成了http://localhost:8080/haha,请注意这里haha后面没有/,然后再加上剩下的xxx,即http://localhost:8080/haha+xxx=http://localhost:8080/hahaxxx;
Nginx限制IP/浏览器访问和精确匹配/set设置变量的示例:
location /admin.html {#nginx 没有if else,故可以多设置几个if
if ( $remote_addr !~* "192.168.1.*|x.x.x.x") {
return 403;
}
if ( $remote_addr ~* "192.168.1.*|1x.x.x.x") {
root /xx/xxx/xx/;
}
if ($remote_addr = 192.168.9.115) {# 如果访问的ip地址为192.168.9.115,则返回403
return 403;
}
if ($http_user_agent ~ Chrome) {# 不允许谷歌浏览器访问 如果是谷歌浏览器返回500
return 500;
}
if ($http_user_agent ~ (125LA|WinHttpRequest|360Spider)) {
return 444;
}
if ($http_referer ~* "filter=author&orderby=dateline") {
return 444;
}
if ($host = 'bbs.gitlib.com') {
rewrite ^/$ http://bbs1.gitlib.com permanent;
}
}
location / { #set设置变量的值
if ( $host ~* (.*)\.yzz\.cn) {
set $domain $1;
}
root /www/website/www/gitlib/$domain/;
# set语法 :set variable value;
}
示例:
server {
listen 80;
server_name localhost;
location /api1/ {
proxy_pass http://localhost:8080;
}
# http://localhost/api1/xxx -> http://localhost:8080/api1/xxx
location /api2/ {
proxy_pass http://localhost:8080/;
}
# http://localhost/api2/xxx -> http://localhost:8080/xxx
location /api3 {
proxy_pass http://localhost:8080;
}
# http://localhost/api3/xxx -> http://localhost:8080/api3/xxx
location /api4 {
proxy_pass http://localhost:8080/;
}
# http://localhost/api4/xxx -> http://localhost:8080//xxx,请注意这里的双斜线,好好分析一下。
location /api5/ {
proxy_pass http://localhost:8080/haha;
}
# http://localhost/api5/xxx -> http://localhost:8080/hahaxxx,请注意这里的haha和xxx之间没有斜杠,分析一下原因。
location /api6/ {
proxy_pass http://localhost:8080/haha/;
}
# http://localhost/api6/xxx -> http://localhost:8080/haha/xxx
location /api7 {
proxy_pass http://localhost:8080/haha;
}
# http://localhost/api7/xxx -> http://localhost:8080/haha/xxx
location /api8 {
proxy_pass http://localhost:8080/haha/;
}
# http://localhost/api8/xxx -> http://localhost:8080/haha//xxx,请注意这里的双斜杠。
}
用户的请求来到Nginx,Nginx可以从请求中获取到的变量
$host: 请求的主机头 举例:$proxy_set_header Host $host;
$remote_addr: 客户端IP地址
$remote_port: 客户端端口号
$remote_user: 已经经过Auth Basic Module验证的用户名
$http_referer: 请求引用地址
$http_user_agent: 客户端代理信息(UA)
$http_x_forwarded_for: 相当于网络访问路径
$body_bytes_sent: 页面传送的字节数
$time_local: 服务器时间
$request: 客户端请求
$request_uri: 请求的URI,带参数, 不包含主机名
$request_filename: 请求的文件路径
$request_method: 请求的方法,如GET、POST
$args: 客户端请求中的参数
$query_string: 等同于$args, 客户端请求的参数
$nginx_version: 当前nginx版本
$status: 服务器响应状态码
$server_addr: 服务器地址
$server_port: 请求到达的服务器端口号
$server_protocol: 请求的协议版本
$content_type: HTTP请求信息里的Content-Type字段
$content_length: HTTP请求信息里的Content-Length字段
$uri: 请求中的当前URI(不带请求参数,参数位于$args)
$document_root: 当前请求在root指令中指定的值
$document_uri: 与$uri相同
Nginx代理给网关的时候,会丢失请求的host信息的案例:
http {
include mime.types;
default_type application/octet-stream;
client_max_body_size 1024m;
sendfile on;
keepalive_timeout 65;
upstream gulimall{
server 192.168.56.1:88 #网关的地址
}
server {
listen 80; #访问时不带端口默认访问 80
server_name gulimall.com;
location / { # / 所有访问gulimall.com的都交给我
proxy_set_header Host $host #Nginx代理给网关的时候,会丢失请求的host信息,所以得带上
#不仅会丢失host信息,还会丢失其他的信息: 见官方网站
proxy_pass http://gulimall;
}
}
}
Nginx对文件上传大小限制
http {
include mime.types;
default_type application/octet-stream;
client_max_body_size 1024m; #Nginx对文件大小的限制
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
.......
}
Nginx的几种负载均衡策略(轮询,权重,ip_hash,最小连接,fair等)
默认轮询:这里的轮询并不是每个请求轮流分配到不同的后端服务器,与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。如果后端服务器down掉,将自动剔除;
http {
upstream backserver { # upstream是配置nginx与后端服务器负载均衡非常重要的一个模块
server 127.0.0.1:9100 weight=3; #其中weight=1表示权重,权重越大访问机会越多
server 127.0.0.1:9200 weight=1;
}
upstream backserver {
#每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失的问题
#可能导致大量的求情访问一个服务器,致使服务器压力过大
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
upstream backserver {
least_conn;#web请求会被转发到连接数最少的服务器上
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
upstream backserver {
server 127.0.0.1:8080;
server 127.0.0.1:9090;
fair;按后端服务器的响应时间来分配请求,响应时间短的优先分配。
}
upstream backserver {
server 127.0.0.1:9100;
#其它所有的非backup机器down的时候,才请求backup机器
server 127.0.0.1:9200 backup;
}
upstream backserver {
server 127.0.0.1:9100;
#down表示当前的server是down状态,不参与负载均衡
server 127.0.0.1:9200 down;
}
server { # 第一个Server区块开始,表示一个独立的虚拟主机站点
listen 80; # 提供服务的端口,默认80
server_name localhost; # 提供服务的域名主机名
charset koi8-r; #配置字符集 系统默认UTF-8,所以这个不用打开
access_log logs/host.access.log main; #配置本虚拟主机的访问日志,只有访问这个server才可以进行日志输出
location /myweb {
proxy_pass http://backserver; #上面的“upstream”对应
}
location / { #配置静态资源拦截 "/"表示请求资源的根路径
root html; #root是配置服务器的默认网站根目录位置,默认为nginx安装主目录下的html目录
index index.html index.htm; # 默认的首页文件,多个用空格分开
#也就是访问“/”时它会到“html”目录下找 “index.html”或者“index.htm”文件
}
#error_page 500 502 503 504 /50x.html; # 配置50x错误页面,出现对应的http状态码时,使用50x.html回应客户
#error_page 404 /404.html; #配置404页面
location = /50x.html { #精确匹配
50x.html
root html; # 指定对应的站点目录为html
}
}
}
Nginx中虚拟主机的理解(基于端口的虚拟主机--了解即可,基于域名的虚拟主机--重点掌握)
1.虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,这样我们的一台装有Nginx的物理服务器就可以当做多个服务器来使用,从而可以配置多个网站。【一台计算机(一个ip地址)配置多个域名】
2.Nginx提供虚拟主机的功能,就是为了让我们不需要安装多个Nginx,就可以运行多个域名不同的网站。
3.Nginx下,一个server标签就是一个虚拟主机。nginx的虚拟主机就是通过nginx.conf中server节点指定的,想要设置多个虚拟主机,配置多个server节点即可;
案例:比如一个公司有多个二级域名,没有必要为每个二级域名都提供一台Nginx服务器,就可以使用虚拟主机技术,在一台nginx服务器上,模拟多个虚拟服务器。
执行流程举例:浏览器输入“www.beijing.myweb.com”就会被本地的DNS映射到Nginx服务器,nginx接收一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的location,location就是实际地址;(server_name配置的就是域名地址;)
#Nginx中的配置
#配置worker进程运行用户 nobody也是一个linux用户,一般用于启动程序,没有密码
worker_processes 1;
error_log logs/error.log;
pid logs/nginx.pid; #配置进程pid文件
###====================================================
events {
worker_connections 1024; #配置每个worker进程连接数上限,取值上线65535
}
###===================================================
http {
include mime.types; #引入支持的文件类型
default_type application/octet-stream; #如果你的文件类型在mime.types没有,以默认流的方式返回;
upstream beijing.myweb.com {
server 127.0.0.1:8001;
}
upstream nanjing.myweb.com {
server 127.0.0.1:8002;
}
upstream tianjin.myweb.com {
server 127.0.0.1:8003;
}
sendfile on; #开启高效文件传输模式
keepalive_timeout 65; #长连接超时时间,单位是秒
###----------------------------------------------
server {
listen 80;
server_name beijing.myweb.com;
location / {
proxy_pass http://www.beijing.myweb.com;
}
}
server {
listen 80;
server_name nanjing.myweb.com;
#当访问这个名字的域名和端口后将进入到这个server里面来
location / {
proxy_pass http://www.nanjing.myweb.com;
}
}
server {
listen 80;
server_name tianjin.myweb.com;
location / {
proxy_pass http://www.tianjin.myweb.com;
}
}
本地DNS映射:需要修改一下本地的hosts文件
在hosts文件配置:
192.168.208.128 www.tianjin.myweb.com
192.168.208.128 www.nanjing.myweb.com
192.168.208.128 www.beijing.myweb.com
静态代理案例
在nginx.conf的location中配置静态资源所在目录实现
例如:当访问静态资源,则从linux服务器/opt/static目录下获取
location ~ .*/(css|js|img|images) { .*:表示任意字符;
root /opt/static;
}
我们将静态资源放入 /opt/static 目录下,然后用户访问时由nginx返回这些静态资源;
静态代理的案例