部署
<h2>多线程实现</h2>
<ul>
<li>采用同一个地址空间实现</li>
</ul>
<h2>多线程产生的问题</h2>
<ul>
<li>如果一个线程中代码写的不够健壮,导致某一段地址空间越界,出现错误,从而导致整个地址空间的线程不可用</li>
</ul>
<h2>什么是信号量</h2>
<ul>
<li>信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。</li>
<li>信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。
<ul>
<li>若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。</li>
</ul></li>
</ul>
<h2>信号量的分类</h2>
<ul>
<li>内核信号量,由内核控制路径使用</li>
<li>用户态进程使用的信号量,这种信号量又分为POSIX信号量和SYSTEMV信号量。
<ul>
<li>POSIX信号量又分为有名信号量和无名信号量。</li>
<li>有名信号量,其值保存在文件中, 所以它可以用于线程也可以用于进程间的同步。</li>
<li>无名信号量,其值保存在内存中。</li>
</ul></li>
</ul>
<h2>查看所有的信号量</h2>
<pre><code class="language-shell">kill -l</code></pre>
<h2>常用信息量</h2>
<pre><code class="language-shell">SIGCHLD kill -17 $PID
SIGQUIT kill -3 $PID
SIGTERM kill -15 $PID
SIGKILL kill -9 $PID
SIGHUP kill -1 $PID
SIGUSR1 kill -10 $PID
SIGUSR2 kill -12 $PID
SIGWINCH kill -28 $PID</code></pre>
<h2>使用信号量管理nginx进程</h2>
<ul>
<li>
<p>Master进程</p>
<ul>
<li>监控worker进程</li>
<li>CHLD</li>
<li>管理worker进程</li>
<li>接收信号</li>
<li>TERM,INT,QUIT,HUP,USR1,USR2,WINCH</li>
</ul>
</li>
<li>
<p>Worker进程</p>
<ul>
<li>接收信号</li>
<li>TERM,INT,QUIT,USR1,WINCH</li>
</ul>
</li>
<li>
<p>命令行</p>
<pre><code class="language-shell">reload: HUP
reopne: USR1
stop: TERM
quit: QUIT</code></pre>
</li>
</ul>
<h2>设置子进程数量</h2>
<ul>
<li>配置文件中</li>
<li>worker_processes 进程数量</li>
</ul>
<h2>查看CPU信息</h2>
<pre><code class="language-sehll">lscpu</code></pre>
<h2>reload重载配置文件的流程</h2>
<ul>
<li>向master进程发送HUP信号(reload命令)</li>
<li>master进程检查配置语法是否正确</li>
<li>master进程打开监听端口</li>
<li>master进程使用新的配置文件启动新的worker子进程</li>
<li>master进程向老的worker子进程发送QUIT信号</li>
<li>旧的worker进程关闭监听句柄,处理完当前连接后关闭进程</li>
</ul>
<h2>热升级的流程</h2>
<ul>
<li>将旧的nginx文件替换成新的nginx文件
<ul>
<li>配置文件,版本,目录结果都要一样???</li>
</ul></li>
<li>向旧的master进程发送USR2信号</li>
<li>旧的master进程修改pid文件,加后缀.oldbin</li>
<li>旧的master进程用新nginx文件启动新master进程</li>
<li>向旧的master进程发送WINCH信号,旧的worker子进程退出</li>
<li>回滚情形
<ul>
<li>向旧的master进程发送HUP,向新的master进程发送QUIT</li>
</ul></li>
</ul>
<h2>热部署(平滑升级)</h2>
<pre><code class="language-shell"># 查看nginx进程
ps -ef | grep nginx
# 查看nginx版本,配置的命令,使用大V命令
nginx -V
# 进入到nginx目录,备份nginx
cp nginx nginx.bak
# 查看nginx进程
ps -ef | grep nginx
# 发送信号
kill -s SIGUSR2 nginx主进程号
# 查看nginx进程
ps -ef | grep nginx
# 会查看到旧的nginx进程和新的nginx进程同时存在
# 停止旧的nginx版本子进程
kill -s SIGWINCH 旧的nginx主进程号
# 查看nginx进程
ps -ef | grep nginx
# 退出旧的nginx主进程
# 如果验证了新功能和修复的bug都没有问题
kill -s SIGQUIT 旧的nginx主进程号
# 升级完了,回滚
kill -s SIGHUP 旧的nginx主进程号</code></pre>
<h2>定制编译安装第一个Nginx</h2>
<h4>下载源码包</h4>
<ul>
<li>zlib-1.2.11.tar.xz</li>
<li>pcre-8.43.tar.gz</li>
<li>nginx-1.16.1.tar.gz</li>
</ul>
<h4>解压源码包</h4>
<pre><code class="language-shell">tar xf zlib-1.2.11.tar.xz
tar xf pcre-8.43.tar.gz
tar xf nginx-1.16.1.tar.gz</code></pre>
<h4>安装nginx相关依赖</h4>
<ul>
<li>也可以在安装nginx中,看报错信息,来看需要提前安装那些nginx库</li>
</ul>
<pre><code class="language-shell"># 安装gcc和gcc-c++编译器
yum install gcc gcc-c++
# 安装openssl和openssl-devel库
yum install openssl openssl-devel
# 安装gd和gd-devel库
yum install gd gd-devel -y</code></pre>
<h2>编译安装nginx(rpm源码包方式安装)</h2>
<pre><code class="language-sehll"># 进入到nginx目录
cd nginx-1.16.1
# 查看configure文件
less configure
# 查看configure参数有哪些
./configure --help
# 指定安装目录
./configure --prefix=安装目录 --conf-path=配置目录 --user=nginx --group=nginx
# 很多参数可以指定,也可以不指定,选择默认目录
# 进行编译
make
# 查看编译后的相关文件
ls -rlt
# 查看Makefie
less Makefie
# 执行安装
make install
# 查看安装成功的相关文件
ls -rlt
# 启动nginx
# 使用rpm源码包方式安装,默认是没有nginx用户,要添加一个nginx用户
useradd nginx
# 关闭防火墙(centOS 7)
systemctl stop firewalld
systemctl disable firewalld
# 取得selinux的状态
getenforce
# 关闭selinux
setenforce 0
# 如果需要永久关闭selinux
# 进入到sysconfig文件
vim /etc/sysconfig/selinux
# 设置selinux禁用
selinux=disabled
# 生效配置文件(如果修改配置文件)
nginx安装目录 -s reload</code></pre>