highlight: a11y-dark
一、简介
什么是nginx?
Nginx是一款自由的、开源的、高性能的HTTP服务器和 反向代理 服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。
- Nginx使用基于事件驱动架构,使得其可以支持数以百万级别的TCP连接
- 高度的模块化和自由软件许可证使得第三方模块层出不穷(开源)
- Nginx是一个跨平台服务器,可以运行在Linux,Windows,FreeBSD,Solaris,AIX,Mac OS等操作系统上
- 稳定性极高
- nginx解决高并发
nginx解决高并发: nginx利用多进程+epoll实现高并发,在启动后,会有一个master进程和多个相互独立的worker进程。每个子进程只有一个线程,采用IO的多路复用米星epoll,实现高并发
nginx其他优点: nginx相比其他web服务器,量级更轻。抗并发,处理请求是异步非阻塞的。编写的模块简单,社区活跃。
二、nginx安装
请参考:https://editor.csdn.net/md/?articleId=126915323
三、nginx配置文件详解
nginx配置文件主要分为三个部分:全局块、events块、http块
- 全局块:从配置文件开始到events块之间的内容,主要设置一些影响nginx的服务器整体运行的配置,包,括配置运行nginx服务器的用户(组)、运行生成worker procss数,进程pid存放路径、日志存放路径和类型以及配置文件的引入等。
- events块:events块主要影响nginx服务器与用户的网络连接。比如 worker connections 1024;表示nginx支持的最大连接数。
- http块:是nginx配置最频繁的部分,代理、缓存和日志定义等绝大部分功能和第三方模块配置都在这里。http块也分为http全局块和server块。http块下面又包含了http全局块和server块。server基本是配置最频繁的地方。
结构图:
...
events {
...
}
http
{
...
server
{
...
location [PATTERN]
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
...
}
详解详情:
user www www;
worker_processes 8;
error_log /var/log/nginx/error.log info;
pid /var/run/nginx.pid;
worker_rlimit_nofile 65535;
events
{
use epoll;
worker_connections 1024;
}
http
{
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 64k;
client_max_body_size 8m;
keepalive_timeout 65;
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
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;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
server
{
listen 80;
server_name 127.0.0.1;
rewrite ^(.*) https://www.baidu.com;
deny 127.0.0.1;
allow 172.18.5.54;
}
upstream myserver {
server 127.0.0.1:8080;
server 192.168.24.189:8080 backup;
}
server
{
listen 443 ssl;
server_name https://www.baidu.com;
root /data/www/;
ssl_certificate C:\WebServer\Certs\certificate.crt;
ssl_certificate_key C:\WebServer\Certs\private.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
index index.html index.htm index.php;
location ~ .*.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location /oauth/{
proxy_pass https://localhost:13580/oauth/;
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|png|bmp|swf)$ {
expires 10d;
}
location ~ .*.(js|css)?$ {
expires 1h;
}
log_format access '$server_name $remote_addr -$remote_user [$time_local] "$request"'
'$status $uptream_status $body_bytes_sent "$http_referer"'
'"$http_user_agent" "$http_x_forwarded_for" '
'$ssl_protocol $ssl_cipher $upstream_addr $request_time $upstream_response_time';
access_log /var/log/nginx/access.log access;
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
}
}
四、nginx常用案例
4.1 反向代理
在介绍反向代理之前,先了解一下什么是正向代理。
- 正向代理:一般的访问流程是客户端直接向目标服务器发送请求并获取内容,使用正向代理后,客户端改为向代理服务器发送请求,并指定目标服务器(原始服务器),然后由代理服务器和原始服务器通信,转交请求并获得的内容,再返回给客户端。正向代理隐藏了真实的客户端,为客户端收发请求,使真实客户端对服务器不可见;
- 反向代理:与一般访问流程相比,使用反向代理后,直接收到请求的服务器是代理服务器,然后将请求转发给内部网络上真正进行处理的服务器,得到的结果返回给客户端。反向代理隐藏了真实的服务器,为服务器收发请求,使真实服务器对客户端不可见。一般在处理跨域请求的时候比较常用。现在基本上所有的大型网站都设置了反向代理。
了解完概念之后呢,我们就来配置一个反向代理案例。比如你想配置通过访问服务器的http:127.0.0.1:8080/test访问代理服务器http:127.0.0.1:8081
server {
listen 8080;
server_name localhost;
location ~ /test/ {
proxy_pass http://127.0.0.1:8081;
}
}
}
proxy_set_header:在将客户端请求发送给后端服务器之前,更改来自客户端的请求头信息。
proxy_connect_timeout:配置Nginx与后端代理服务器尝试建立连接的超时时间。
proxy_read_timeout:配置Nginx向后端服务器组发出read请求后,等待相应的超时时间。
proxy_send_timeout:配置Nginx向后端服务器组发出write请求后,等待相应的超时时间。
proxy_redirect:用于修改后端服务器返回的响应头中的Location和Refresh。
4.2 跨域问题
什么是跨域问题?跨域是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全策略。所谓同源指域名、端口、协议均相同。
# 案例1 反向代理实现跨域
server {
listen 8080;
server_name localhost;
location ~ /test/ {
proxy_pass http://127.0.0.1:8081;
}
}
}
# 案例2 配置header跨域请求
4.3 gzip压缩
gzip是一种网页压缩技术,传输的网页经过 gzip 压缩之后大小通常可以变为原来的一半甚至更小。所以开启gzip压缩可以增加网络传输效率。开启gzip压缩的使用,浏览器的请求头要有Accept-Encoding: gzip,表示自己支持gzip压缩。
gzip on;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
4.4 负载均衡
负载均衡就是Nginx将请求分摊到不同的服务器中,保证服务的可用性,缓解服务压力,保证服务的响应速度,即使某一个应用服务不可用,也可以保证业务的正常进行,并且方便对服务器进行扩容缩容。
upstream myserver {
server localhost:8080;
server localhost:8081;
}
server {
....
location / {
proxy_pass myserver;#请求转向mysvr 定义的服务器列表
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
4.4.1 热备
upstream myserver {
server localhost:8080;
server localhost:8081 backup;
}
4.4.2 轮询
upstream myserver {
server localhost:8080;
server localhost:8081;
}
4.4.3 加权轮询
upstream myserver {
server localhost:8080 weight=1;
server localhost:8081;
}
4.4.4 ip_hash
upstream myserver {
server localhost:8080;
server localhost:8081;
ip_hash;
}
4.4.5 其他常用参数
- down,表示当前的server暂时不参与负载均衡。
- backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
- max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
- fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
- weight 默认为1.weight越大,负载的权重就越大。
5、动静分离
动静分离是为了加快网页解析速度。将动态请求和静态请求隔离开来。简单来说就是让nginx服务器负责解析静态请求,动态请求交给服务器tomcat解析。从实现角度来说,一是可以将静态资源单独放在一个服务器,二是静态文件和动态文件混合一起但是通过nginx来实现分开
http {
……
server {
listen 80;
server_name 192.168.17.129;
location /test/ {
root /data/;
index index.html index.htm;
}
location /image/ {
root /data/;
autoindex on; // 列出访问目录
}
}
}
# 就是当请求是以/test/开始的,则进入/test/data/目录下找资源,如果是以/image/开始的,则进入/image/data/目录下找资源,同时该路径下配置了一个autoindex on,当访问/image/目录时,会列出该目录下的所有文件
五、localtion详解
Location 块通过指定模式来与客户端请求的URI相匹配。
Location基本语法:
- 匹配 URI 类型,有四种参数可选,当然也可以不带参数。
- 命名location,用@来标识,类似于定义goto语句块。
location [ = | ~ | ~* | ^~ ] /URI { … }
location @/name/ { … }
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents {
[ configuration C ]
}
location ~ /documents/ABC {
[ configuration CC ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* .(gif|jpg|jpeg)$ {
[ configuration E ]
}
location /images/ {
[ configuration F ]
}
location /images/abc {
[ configuration G ]
}
location ~ /images/abc/ {
[ configuration H ]
}
六、stream模块
在开发过程中遇到了这么一个问题,部署数据库的服务默认端口因为安全原因被禁止开启了,那么我仍然想连接数据库,这时候就可以用到nginx stream模块。
stream模块一般用于tcp/UDP数据流的代理和负载均衡,可以通过stream模块代理转发TCP消息。一般有两个应用场景
- 一是实现流量的代理转发。 这里所述的代理转发是指,只有一些端口服务被限制为活动IP地址。
- 二是实现流量负载均衡。 有多个tcp或udp端口服务,如DNS。 流模块支持负载平衡算法,如轮询、最小连接数和ip_hash,从而实现数据流负载平衡。
nginx默认是没有开启nginx的,如果想要使用stream模块需要重新执行configure命令并配置编译环境(./configure --with-stream)
stream {
upstream kevin {
server 192.168.10.10:8080;
server 192.168.10.20:8081;
server 192.168.10.30:8081;
}
server {
listen 8081;
proxy_timeout 20s;
proxy_pass kevin;
}
}
|