同步與異步:
創(chuàng)新互聯(lián)致力于網(wǎng)站建設(shè),網(wǎng)站制作設(shè)計(jì),營(yíng)銷網(wǎng)頁(yè)按需策劃設(shè)計(jì),外貿(mào)網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),小程序制作,網(wǎng)站SEO優(yōu)化,網(wǎng)站設(shè)計(jì)制作案例豐富,是成都做網(wǎng)站公司和建站公司,歡迎咨詢。同步與異步的重點(diǎn)在消息通知的方式上,也就是調(diào)用結(jié)果的通知方式不同。
**同步:**當(dāng)一個(gè)同步調(diào)用發(fā)出去后,調(diào)用者要一直等待調(diào)用的結(jié)果通知后,才能進(jìn)行后續(xù)的執(zhí)行。
**異步:**當(dāng)一個(gè)異步調(diào)用發(fā)出去后,調(diào)用者不必一直等待調(diào)用結(jié)果的返回,異步調(diào)用,要想獲得結(jié)果,
一般有兩種方式:
阻塞與非阻塞的概念
阻塞與非阻塞的重點(diǎn)在于進(jìn)/線程等待消息時(shí)候的行為,也就是在等待消息的時(shí)候,當(dāng)前進(jìn)/線程是掛起狀態(tài),還是非掛起狀態(tài)。
**阻塞:**調(diào)用在發(fā)出去后,在消息返回之前,當(dāng)前進(jìn)/線程會(huì)被掛起,直到有消息返回,當(dāng)前進(jìn)/線程才會(huì)被激活
**非阻塞:**調(diào)用在發(fā)出去后,不會(huì)阻塞當(dāng)前進(jìn)/線程,而會(huì)立即返回。
同步與異步,重點(diǎn)在于消息通知的方式;阻塞與非阻塞,重點(diǎn)在于等消息時(shí)候的行為。
四種組合方式
epoll模型
當(dāng)連接有 I/O 事件產(chǎn)生的時(shí)候,epoll 就會(huì)去告訴進(jìn)程哪個(gè)連接有 I/O 事件產(chǎn)生,然后進(jìn)程就去處理這個(gè)事件。
Nginx 采用了異步非阻塞的方式工作。我們先來(lái)先了解一下 I/O 多路復(fù)用中的 epoll 模型。
2、nginx概述Nginx的工作原理
nginx的概述:
Nginx工作模式
nginx 有兩種工作模式:master-worker 模式和單進(jìn)程模式;在 master-worker 模式下,有一個(gè) master 進(jìn)程和至少一個(gè)的 worker 進(jìn)程,單進(jìn)程模式顧名思義只有一個(gè)進(jìn)程。這兩種模式有各自的特點(diǎn)和適用場(chǎng)景。
master-worker模式:
單進(jìn)程模式:
單進(jìn)程模式下,nginx 啟動(dòng)后只有一個(gè)進(jìn)程,nginx 的所有工作都由這個(gè)進(jìn)程負(fù)責(zé)。由于只有一個(gè)進(jìn)程,因此可以很方便地利用 gdb 等工具進(jìn)行調(diào)試。該模式不支持 nginx 的平滑升級(jí)功能,任何的信號(hào)處理都可能造成服務(wù)中斷,并且由于是單進(jìn)程,進(jìn)程掛掉后,在沒(méi)有外部監(jiān)控的情況下,無(wú)法重啟服務(wù)。因此,該模式一般只在開(kāi)發(fā)階段和調(diào)試時(shí)使用,生產(chǎn)環(huán)境下不會(huì)使用。
3、nginx配置文件結(jié)構(gòu)user www www;
#程序運(yùn)行用戶和組
worker_processes auto;
#啟動(dòng)進(jìn)程,指定 nginx 啟動(dòng)的工作進(jìn)程數(shù)量,建議按照 cpu 數(shù)目來(lái)指定,一般等于 cpu 核心數(shù)目
error_log /home/wwwlogs/nginx_error.log crit;
#全局錯(cuò)誤日志
pid /usr/local/nginx/logs/nginx.pid;
#主進(jìn)程 PID 保存文件
worker_rlimit_nofile 51200;
#文件描述符數(shù)量
events
{use epoll;
#使用 epoll 模型,對(duì)于 2.6 以上的內(nèi)核,建議使用 epoll 模型以提高性能
worker_connections 51200;
#工作進(jìn)程的大連接數(shù)量
}
http{#網(wǎng)站優(yōu)化參數(shù)
server {#具體的某一網(wǎng)站的配置信息
listen 80; #監(jiān)聽(tīng)端口
root html; #網(wǎng)頁(yè)根目錄(/usr/local/nginx/html)
server_name www.atguigu.com; #服務(wù)器域名
index index.html; #默認(rèn)加載頁(yè)面
access_log logs/access.log; #訪問(wèn)日志保存位置
......;
location (.*)\.php$ {#用正則匹配具體的訪問(wèn)對(duì)象;
}
location {#跳轉(zhuǎn)等規(guī)則;
}
} #這個(gè)括號(hào)是到server級(jí)
} #這個(gè)對(duì)應(yīng)的是http這個(gè)括號(hào)
4、Nginx的實(shí)驗(yàn)注意事項(xiàng):
實(shí)驗(yàn)1:nginx的狀態(tài)統(tǒng)計(jì)
#修改配置文件
[root@Node3 ~]# vim /usr/local/nginx/conf/nginx.conf
.............
#在server中找個(gè)位置寫(xiě)入這個(gè)
location /stub_status {stub_status on;
access_log off;
}
#重啟nginx
[root@Node3 ~]# 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
[root@Node3 ~]# nginx -s reload
[root@Node3 ~]#
#瀏覽器訪問(wèn)
http://192.168.75.133/stub_status
#輸出的結(jié)果詳情:
"Active connections"表示當(dāng)前的活動(dòng)連接數(shù);
"server accepts handled requests"表示已經(jīng)處理的連接信息
三個(gè)數(shù)字依次表示已處理的連接數(shù)、成功的 TCP 握手次數(shù)、已處理的請(qǐng)求數(shù)
實(shí)驗(yàn)2:目錄保護(hù)
[root@Node3 ~]# vim /usr/local/nginx/conf/nginx.conf
...............
#添加兩行
location /stub_status {stub_status on;
access_log off;
auth_basic "Weclome to nginx_status";
auth_basic_user_file /usr/local/nginx/html/htpasswd.nginx;
}
#重啟nginx
#創(chuàng)建密碼文件
#我們要提取這個(gè)htpasswd命令
[root@Node3 ~]# yum -y install httpd
[root@Node3 ~]# htpasswd -c /usr/local/nginx/html/htpasswd.nginx zhangsan
New password:
Re-type new password:
Adding password for user zhangsan
#然后瀏覽器驗(yàn)證
http://192.168.75.133/stub_status
#輸入:zhangsan
#輸入密碼:
實(shí)驗(yàn)3:基于ip的身份驗(yàn)證(訪問(wèn)控制)
allow 192.168.75.1
deny 192.168.75.0/24
僅允許 192.168.75.1 訪問(wèn)服務(wù)器
#修改配置文件
[root@Node3 ~]# vim /usr/local/nginx/conf/nginx.conf
.....................
location /stub_status {allow 192.168.75.1;
deny 192.168.75.0/24;
stub_status on;
access_log off;
auth_basic "Weclome to nginx_status";
auth_basic_user_file /usr/local/nginx/html/htpasswd.nginx;
}
#重啟驗(yàn)證
[root@Node3 ~]# nginx -s reload
#瀏覽器訪問(wèn)
http://192.168.75.133/stub_status
[root@Node3 ~]# curl 192.168.75.133/stub_status
實(shí)驗(yàn)4:nginx的虛擬主機(jī)(基于域名)
#準(zhǔn)備好兩個(gè)網(wǎng)站的頁(yè)面
[root@Node3 html]# mkdir blog bbs
[root@Node3 html]# vim blog/index.html
THis is blog.liangjiawei.net
[root@Node3 html]# vim bbs/index.html
This is BBS.LIANGJAIWEI.NET
#修改一下hosts文件-->識(shí)別兩個(gè)網(wǎng)站
[root@Node3 html]# vim /etc/hosts
192.168.75.133 blog.liangjiawei.net
192.168.75.133 bbs.liangjiawei.net
#修改nginx的配置文件
[root@Node3 nginx]# vim conf/nginx.conf
............
#把日志文件定義打卡
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;
...................
#添加下面的內(nèi)容
server {listen 80;
server_name blog.liangjiawei.net;
index index.html index.htm index.php;
root html/blog;
access_log logs/blog-access.log main;
}
server {listen 80;
server_name bbs.liangjiawei.net;
index index.html index.htm index.php;
root html/bbs;
access_log logs/blog-access.log main;
}
#重啟nginx
[root@Node3 nginx]# nginx -s reload
#然后驗(yàn)證
[root@Node3 nginx]# curl blog.liangjiawei.net
THis is blog.liangjiawei.net
[root@Node3 nginx]# curl bbs.liangjiawei.net
This is BBS.LIANGJAIWEI.NET
實(shí)驗(yàn)5:nginx的發(fā)現(xiàn)代理
代理與反向代理
實(shí)驗(yàn)的規(guī)劃
location / { proxy_pass http://192.168.75.134:80; #此處填寫(xiě) apache 服務(wù)器的 IP 地址
}
#開(kāi)啟另外一臺(tái)服務(wù)器,并且安裝個(gè)apache
[root@Node4 ~]# yum -y install httpd
[root@localhost ~]# service httpd start
[root@localhost ~]# vim /var/www/html/index.html
this is Centos6
#nginx服務(wù)器配置,修改配置文件
[root@Node3 nginx]# vim conf/nginx.conf
............
#添加這個(gè)表格,把之前的/都注釋掉
location / {proxy_pass http://192.168.75.110:80;
}
# location / { # root html;
# index index.php index.html index.htm;
# }
#重啟
[root@Node3 nginx]# nginx -s reload
#然后直接訪問(wèn)nginx服務(wù)器-->瀏覽器訪問(wèn)
http://192.168.75.133/
實(shí)驗(yàn)6:負(fù)載調(diào)度(負(fù)載均衡)
負(fù)載均衡(Load Balance)其意思就是將任務(wù)分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行執(zhí)行,例如 Web 服務(wù)器、FTP 服務(wù)器、企業(yè)關(guān)鍵應(yīng)用服務(wù)器和其它關(guān)鍵任務(wù)服務(wù)器等,從而共同完成工作任務(wù)。
upstream bbs {#此標(biāo)簽在 server 標(biāo)簽前添加
server 192.168.75.110:80;
server 192.168.75.130:80;
}
server {........;
#修改自帶的 location / 的標(biāo)簽,將原內(nèi)容刪除,添加下列兩項(xiàng)
location / {proxy_pass http://bbs; #添加反向代理,代理地址填寫(xiě) upstream 聲明的名字
proxy_set_header Host $host; #重寫(xiě)請(qǐng)求頭部,保證網(wǎng)站所有頁(yè)面都可訪問(wèn)成功
}
}
拓展補(bǔ)充:rr 算法實(shí)現(xiàn)加權(quán)輪詢
upstream bbs {server 192.168.88.100:80 weight=1;
server 192.168.88.200:80 weight=2;
}
實(shí)驗(yàn)過(guò)程
#再開(kāi)一臺(tái)服務(wù)器;然后安裝httpd
[root@node0 ~]# yum -y install httpd
[root@node0 ~]# systemctl start httpd
[root@node0 ~]# vim /var/www/html/index.html
This is 130
#nginx服務(wù)器修改配置文件
[root@Node3 nginx]# vim conf/nginx.conf
........
#在server標(biāo)簽上面添加
upstream LL {server 192.168.75.110:80;
server 192.168.75.130:80;
}
..............
#然后在location /這個(gè)標(biāo)簽上修改
location / {proxy_pass http://LL;
proxy_set_header Host $host;
}
#重啟nginx
[root@Node3 nginx]# nginx -t
[root@Node3 nginx]# nginx -s reload
#直接訪問(wèn)本機(jī)-->可以看到輪詢了
[root@Node3 nginx]# curl 192.168.75.133
This is 130
[root@Node3 nginx]# curl 192.168.75.133
this is Centos6
[root@Node3 nginx]# curl 192.168.75.133
This is 130
實(shí)驗(yàn)7:nginx實(shí)現(xiàn)https{證書(shū)+rewrite}
server {.......;
ssl on;
ssl_certificate /usr/local/nginx/conf/ssl/liangjiawei.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/liangjiawei.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers
"EECDH+CHACHA20:EECDH+CHACHA20draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
}
# openssl genrsa -out atguigu.key 1024
建立服務(wù)器私鑰,生成 RSA 密鑰
# openssl req -new -key atguigu.key -out atguigu.csr
需要依次輸入國(guó)家,地區(qū),組織,email。最重要的是有一個(gè) common name,可以寫(xiě)你的名字或者域名。如果為了 https 申請(qǐng),這個(gè)必須和域名吻合,否則會(huì)引發(fā)瀏覽器警報(bào)。生成的 csr 文件交給 CA 簽名后形成服務(wù)端自己的證書(shū)
# openssl x509 -req -days 365 -sha256 -in atguigu.csr -signkey atguigu.key -out atguigu.crt
生成簽字證書(shū)
# cp atguigu.crt /usr/local/nginx/conf/ssl/atguigu.crt
# cp atguigu.key /usr/local/nginx/conf/ssl/atguigu.key
將私鑰和證書(shū)復(fù)制到指定位置
server {..........;
listen 443;
}
新增以下 server 標(biāo)簽(利用虛擬主機(jī)+rewrite 的功能)
server{listen 80;
server_name blog.liangjiawei.net;
rewrite ^(.*)$ https://blog.liangjiawei.net permanent;
root html;
index index.html index.htm;
}
實(shí)驗(yàn)過(guò)程
#修改nginx的配置文件
[root@Node3 nginx]# vim conf/nginx.conf
#找到之前做的blog的server標(biāo)簽,添加進(jìn)去
.............
server {listen 80;
server_name blog.liangjiawei.net;
index index.html index.htm index.php;
root html/blog;
access_log logs/blog-access.log main;
ssl on;
ssl_certificate /usr/local/nginx/conf/ssl/liangjiawei.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/liangjiawei.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3
DES:RSA+3DES:!MD5";
}
#生成證書(shū)和密鑰文件
[root@Node3 nginx]# cd conf/
[root@Node3 conf]# mkdir ssl
[root@Node3 conf]# cd ssl
[root@Node3 ssl]# openssl genrsa -out liangjiawei.key 1024
Generating RSA private key, 1024 bit long modulus
............................................++++++
...++++++
e is 65537 (0x10001)
[root@Node3 ssl]# openssl req -new -key liangjiawei.key -out liangjiawei.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:gd
Locality Name (eg, city) [Default City]:gz
Organization Name (eg, company) [Default Company Ltd]:ns
Organizational Unit Name (eg, section) []:zjj
Common Name (eg, your name or your server's hostname) []:ja
Email Address []:liangjaiwei@123
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@Node3 ssl]# openssl x509 -req -days 365 -sha256 -in liangjiawei.csr -signkey liangjiawei.key -out liangjiawei.crt
Signature ok
subject=/C=cn/ST=gd/L=gz/O=ns/OU=zjj/CN=ja/emailAddress=liangjaiwei@123
Getting Private key
#再回到nginx上調(diào)整一下端口
[root@Node3 ssl]# cd ..
[root@Node3 conf]# vim nginx.conf
.......
#原來(lái)加密的server標(biāo)簽要改為443
server {listen 443;
server_name blog.liangjiawei.net;
index index.html index.htm index.php;
root html/blog;
access_log logs/blog-access.log main;
ssl on;
ssl_certificate /usr/local/nginx/conf/ssl/liangjiawei.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/liangjiawei.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3
DES:RSA+3DES:!MD5";
}
#然后新添加一個(gè)標(biāo)簽
server{listen 80;
server_name blog.liangjiawei.net;
rewrite ^(.*)$ https://blog.liangjiawei.net permanent;
root html;
index index.html index.htm;
}
#重啟驗(yàn)證
[root@Node3 conf]# nginx -s reload
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧