Nginx-入门

2.1为什么选择nginx

Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:
作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.
作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下进行软件版本的升级。

2.2HTTP基础功能

1、处理静态文件,索引文件以及自动索引;
2、反向代理加速(无缓存),简单的负载均衡和容错;
3、FastCGI,简单的负载均衡和容错;
4、模块化的结构。过滤器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;
5、SSL 和 TLS SNI 支持;

2.3安装

1、下载地址:
http://nginx.org/en/download.html
mainline:主线版本,
stable:稳定版本
2、安装步骤
wget http://nginx.org/download/nginx-1.15.7.tar.gz
tar zxvf nginx-1.15.7.tar.gz

yum install pre pre-devel -y
yum install pcre-devel -y //为了rewrite的包
yum install oppenssl-devel -y
yum install libxml2-devel -y
yum -y install gd-devel -y
yum -y install GeoIP GeoIP-devel GeoIP-data

./configure
–prefix=/usr/local/nginx
–sbin-path=/usr/sbin/nginx/nginx
–modules-path=/usr/lib/nginx/modules
–conf-path=/usr/local/nginx/nginx.conf
–pid-path=/usr/local/nginx/nginx.pid
–error-log-path=/var/log/nginx/error.log
–http-log-path=/var/log/nginx/access.log
–pid-path=/var/run/nginx.pid
–lock-path=/var/run/nginx.lock
–http-client-body-temp-path=/var/cache/nginx/client_temp
–http-proxy-temp-path=/var/cache/nginx/proxy_temp
–http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
–http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
–http-scgi-temp-path=/var/cache/nginx/scgi_temp
–user=nginx
–group=nginx
–with-http_ssl_module
–with-http_realip_module
–with-http_addition_module
–with-http_sub_module
–with-http_dav_module
–with-http_flv_module
–with-http_mp4_module
–with-http_gunzip_module
–with-http_gzip_static_module
–with-http_random_index_module
–with-http_secure_link_module
–with-http_stub_status_module
–with-http_auth_request_module
–with-http_xslt_module=dynamic
–with-http_image_filter_module=dynamic
–with-http_geoip_module=dynamic
–with-threads
–with-stream
–with-stream_ssl_module
–with-stream_ssl_preread_module
–with-stream_realip_module
–with-stream_geoip_module=dynamic
–with-http_slice_module
–with-mail
–with-mail_ssl_module
–with-compat
–with-file-aio
–with-http_degradation_module
–with-http_v2_module
–with-debug

2.4运行和控制nginx

1、nginx命令行参数
不像许多其他软件系统,Nginx 仅有几个命令行参数,完全通过配置文件来配置
-c </path/to/config> 为 Nginx 指定一个配置文件,来代替缺省的。
-t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
-v 显示 nginx 的版本。
-V 显示 nginx 的版本,编译器版本和配置参数。
-?,-h : this help 查看帮助信息
-q : suppress non-error messages during configuration testing在配置测试期间抑制非错误消息
-s signal : send signal to a master process: stop, quit, reopen, reload 传递一个信号,stop快速关闭,quit从容关闭,reopen重新打开日志文件、用于切换日志文件,reload重载配置文件
-p prefix : set prefix path (default: /usr/local/nginx/)设置nginx启动目录
-c filename : set configuration file (default: conf/nginx.conf) 设置配置文件
-g directives : set global directives out of configuration file设置全局指令
在这里插入图片描述

2、nginx控制信号
可以使用信号系统来控制主进程。默认,nginx 将其主进程的 pid 写入到 /usr/local/nginx/nginx.pid 文件中。通过传递参数给 ./configure 或使用 pid 指令,来改变该文件的位置。
主进程可以处理以下的信号:
TERM, INT 快速关闭
QUIT 从容关闭
HUP 重载配置
用新的配置开始新的工作进程
从容关闭旧的工作进程
USR1 重新打开日志文件
USR2 平滑升级可执行程序。
WINCH 从容关闭工作进程
尽管你不必自己操作工作进程,但是,它们也支持一些信号:
TERM, INT 快速关闭
QUIT 从容关闭
USR1 重新打开日志文件

3、nginx 启动、停止、重启命令
(1)nginx启动
sudo /usr/local/nginx/nginx (nginx二进制文件绝对路径,可以根据自己安装路径实际决定)

(2)nginx从容停止命令,等所有请求结束后关闭服务
ps -ef |grep nginx
kill -QUIT nginx主进程号

(3)nginx 快速停止命令,立刻关闭nginx进程
ps -ef |grep nginx
kill -TERM nginx主进程号
如果以上命令不管用,可以强制停止
kill -9 nginx主进程号

如果嫌麻烦可以不用查看进程号,直接使用命令进行操作
其中/usr/local/nginx/nginx.pid 为nginx.conf中pid命令设置的参数,用来存放nginx主进程号的文件
kill -信号类型(HUP|TERM|QUIT) cat /usr/local/nginx/nginx.pid

(3)nginx重启命令
nginx重启可以分成几种类型
1.简单型,先关闭进程,修改你的配置后,重启进程。
kill -QUIT cat /usr/local/nginx/nginx.pid
sudo /usr/local/nginx/nginx

2.重新加载配置文件,不重启进程,不会停止处理请求(HUP)
当 nginx 接收到 HUP 信号,它会尝试先解析配置文件(如果指定配置文件,就使用指定的,否则使用默认的),成功的话,就应用新的配置文件(例如:重新打开日志文件或监听的套接 字)。之后,nginx 运行新的工作进程并从容关闭旧的工作进程。通知工作进程关闭监听套接字但是继续为当前连接的客户提供服务。所有客户端的服务完成后,旧的工作进程被关闭。 如果新的配置文件应用失败,nginx 将继续使用旧的配置进行工作。

3.平滑更新nginx二进制,不会停止处理请求(USR2)
你可以在不中断服务的情况下 - 新的请求也不会丢失,使用新的 nginx 可执行程序替换旧的(当升级新版本或添加/删除服务器模块时)。
首先,使用新的可执行程序替换旧的(最好做好备份),然后,发送 USR2 (kill -USR2 pid)信号给主进程。主进程将重命名它的 .pid 文件为 .oldbin (比如:/usr/local/nginx/logs/nginx.pid.oldbin),然后执行新的可执行程序,依次启动新的主进程和新的工作进程:
在这里插入图片描述

在这时,两个 nginx 实例会同时运行,一起处理输入的请求。要逐步停止旧的实例,你必须发送 WINCH 信号给旧的主进程,然后,它的工作进程就将开始从容关闭:
在这里插入图片描述
一段时间后,旧的工作进程处理了所有已连接的请求后退出,就仅由新的工作进程来处理输入的请求了:
在这里插入图片描述
这时,因为旧的服务器还尚未关闭它监听的套接字,所以,通过下面的几步,你仍可以恢复旧的服务器:
发送 HUP 信号给旧的主进程 - 它将在不重载配置文件的情况下启动它的工作进程
发送 QUIT 信号给新的主进程,要求其从容关闭其工作进程
发送 TERM 信号给新的主进程,迫使其退出
如果因为某些原因新的工作进程不能退出,向其发送 KILL 信号
新的主进程退出后,旧的主进程会由移除 .oldbin 前缀,恢复为它的 .pid 文件,这样,一切就都恢复到升级之前了。
如果尝试升级成功,而你也希望保留新的服务器时,发送 QUIT 信号给旧的主进程使其退出而只留下新的服务器运行:
在这里插入图片描述

2.5配置符号参考

在这里插入图片描述

2.6Nginx主机配置

2.6.1Nginx.conf配置

worker_processes 1//表示1个工作的子进程,一般设置为 cpu数量核数
worker_processes auto;//表示自动设置为:cpu数量
核数

events {
worker_connections 1024;//表示一个子进程最大允许1024个连接
}

http{//这里配置http服务器的主要段
Server1{//配置虚拟主机段
Location{//配置请求定位,特殊文件特殊定位,比如图片,.php等

}
}
include /usr/local/nginx/conf.d/*.conf;

}

2.6.2Conf.d/*.conf配置

server{
listen 80;
server_name a.com ,b.com,192.168.1.208
location{
root /data/www/a.com
index index.html
}
}

2.6.3日志管理

log_format main '$remote_addr - r e m o t e u s e r [ remote_user [ time_local] “KaTeX parse error: Double superscript at position 34: … '̲status b o d y b y t e s s e n t &quot; body_bytes_sent &quot; http_referer” ’
‘“ h t t p u s e r a g e n t &quot; &quot; http_user_agent&quot; &quot; http_x_forwarded_for”’;
例子:
120.78.195.220 - - [11/Apr/2019:10:54:12 +0800] “POST /api/login HTTP/1.1” 200 103 “-” “-” “-”
120.78.195.220 - - [11/Apr/2019:10:54:17 +0800] “POST /api/login HTTP/1.1” 200 103 “-” “-” “-”
119.139.198.54 - - [11/Apr/2019:10:54:40 +0800] “GET / HTTP/1.1” 302 560 “-” “Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36” “-”
119.139.198.54 - - [11/Apr/2019:10:54:48 +0800] “GET /?source=ADMIN&url=http://admin.com HTTP/1.1” 302 560 “-” “Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36” “-”
在这里插入图片描述

#2.6.4location匹配

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.6.5rewrite重写

在这里插入图片描述
在这里插入图片描述

2.6.6php与nginx整合

在这里插入图片描述

2.6.7gzip压缩

gzip on;
gzip_min_length 1k;
gzip_buffers 32 4k;【每压缩32个包,1个包大小为4k就向客户端发送】
gzip_comp_level 6;【1-10的压缩级别】
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary off;【该头域的主要功能时要告诉客户端数据已经在服务器进行了压缩,默认设置为off】
gzip_disable “MSIE [1-6].”;

2.6.8expires缓存设置提升网站性能

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.6.9HTTP状态码

1xx(临时响应)
表示临时响应并需要请求者继续执行操作的状态代码。

代码 说明
100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。

2xx (成功)
表示成功处理了请求的状态代码。

代码 说明
200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
201 (已创建) 请求成功并且服务器创建了新的资源。
202 (已接受) 服务器已接受请求,但尚未处理。
203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。
206 (部分内容) 服务器成功处理了部分 GET 请求。

3xx (重定向)
表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。

代码 说明
300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

4xx(请求错误)
这些状态代码表示请求可能出错,妨碍了服务器的处理。

代码 说明
400 (错误请求) 服务器不理解请求的语法。
401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403 (禁止) 服务器拒绝请求。
404 (未找到) 服务器找不到请求的网页。
405 (方法禁用) 禁用请求中指定的方法。
406 (不接受) 无法使用请求的内容特性响应请求的网页。
407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
408 (请求超时) 服务器等候请求时发生超时。
409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。
411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
415 (不支持的媒体类型) 请求的格式不受请求页面的支持。
416 (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
417 (未满足期望值) 服务器未满足"期望"请求标头字段的要求。

5xx(服务器错误)
这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。

代码 说明
500 (服务器内部错误) 服务器遇到错误,无法完成请求。
501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。

2.6.10配置ssl证书实现https访问

server {
listen 8008;
server_name admin.com;
access_log /var/log/nginx/admin.net.log main;
if ($http_user_agent ~* “qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot”)
{
return 403;
}
try_files $uri KaTeX parse error: Expected '}', got 'EOF' at end of input: … ^(.*) https://server_name$1 permanent;
}
location ~ /. {
deny all;
}

}

server {
listen 443 ssl http2 ;
server_name admin.com;
access_log /var/log/nginx/admin.net.log main;
if ($http_user_agent ~* “qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot”)
{
return 403;
}
root /usr/share/nginx/html/admin/public/;

	ssl_certificate /etc/nginx/conf.d/ssl/admin/admin.pem;
    ssl_certificate_key /etc/nginx/conf.d/ssl/admin/admin.key;
    ssl_session_cache shared:SSL:1m;【回话缓存,多个工作进程之间共享内存】
    ssl_session_timeout  10m;【客户端可以重用会话缓存中ssl参数的过期时间】
    ssl_ciphers HIGH:!aNULL:!MD5;【密码加密方式】
    ssl_prefer_server_ciphers on;【依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码】

    try_files $uri $uri/ @rewrite;
    location @rewrite { 
        rewrite ^/(.*)$ /index.php?_url=/$1;
    }
    
    location / {
        index   index.php index.html index.htm;
        limit_except GET HEAD POST PUT DELETE{
           deny  all;
        }
        
        if  ( !-e $request_filename ) {
              rewrite ^(.*)$  /index.php last;
        }

}
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /usr/share/nginx/html/admin/public/$fastcgi_script_name;
        include        fastcgi_params;
    }
    location ~ /\. {
        deny  all;
    }

}

2.6.11配置案例分析

server {
listen 8001;
server_name 127.0.0.1;
access_log /var/log/nginx/admin.access.log main;
error_log /var/log/nginx/admin.error.log error;

if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot")
{
	return 403;
}

root /usr/share/nginx/html/admin/public/;
try_files $uri $uri/ @rewrite;
location @rewrite {
    rewrite ^/(.*)$ /index.php?_url=/$1;
}
location / {
	index   index.php index.html index.htm;
	add_header Access-Control-Allow-Origin *;
	add_header Access-Control-Allow-Headers X-Requested-With;
	add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
	limit_except GET HEAD POST PUT DELETE{
	   deny  all;
	}

	if  ( !-e $request_filename ) {
		  rewrite ^(.*)$  /index.php last;
	}

}
location ~ \.php$ {
	fastcgi_pass   127.0.0.1:9000;
	fastcgi_index  index.php;
	fastcgi_param  SCRIPT_FILENAME  /data/www/admin/$fastcgi_script_name;
	include        fastcgi_params;
}


location ~ /\. {
	deny  all;
}

}

配置2:
server {
listen 80;
server_name 127.0.0.1;
access_log /var/log/nginx/home.access.log main;
if ($http_user_agent ~* “qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot”) {
return 403;
}
set $root_path ‘/usr/share/nginx/html/home’;
root $root_path;
try_files $uri $uri/ @rewrite;
location / {
index index.html ;
ssi on;
limit_except GET HEAD POST PUT DELETE {
deny all;
}
if ( !-e KaTeX parse error: Expected '}', got 'EOF' at end of input: … rewrite ^(.*) /index.html last;
}
}
location @rewrite {
rewrite ^/(.*)$ /index.html?_url=/$1;
}

location /aaa/{
    proxy_pass http://bbb/;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header REMOTE-HOST $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;【X-Forwarded-For: client, proxy1, proxy2】
}

location /cc{
	proxy_pass http://dd;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header REMOTE-HOST $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_http_version 1.1;
	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header Connection "upgrade";
}



location /api/{
	proxy_pass http://127.0.0.1:81/;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header REMOTE-HOST $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location ~ /\. {
	deny  all;
}

}

2.7Nginx中级和高级培训内容介绍

2.7.1中级培训内容:

(1)介绍nginx各个知名模块的作用,以及安装注意事项
(2)Nginx反向代理+负载均衡+(反向代理实现动静分离)
(3)Nginx防盗链配置
(3)Nginx实操配置

2.7.2高级培训内容:

(1)Nginx服务优化配置
(2)nginx+php+memcache实现hash一致性memcache集群
(3)高性能服务集群架设配置,ab压测工具对比看效果

猜你喜欢

转载自blog.csdn.net/qq_38105384/article/details/89316552