1. Linux に NGINX をインストールする
Centos では、yum ソースでは nginx のインストールが提供されません。 switch yum ソースメソッドを使用して取得してインストールします。インストール パッケージを直接ダウンロードすることもできます。次のコマンドを実行するには root 権限が必要です: まず、必要なライブラリをインストールします (nginx の gzip モジュールには zlib ライブラリが必要で、書き換えモジュールには pcre ライブラリが必要で、ssl 関数には openssl ライブラリが必要です) )。インストールディレクトリとして /usr/local を選択します。以下の具体的なバージョン番号は実際の状況に応じて変わります。
1.1. PCRE ライブラリをインストールします
$ cd /usr/local/ $ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.36.tar.gz $ tar -zxvf pcre-8.36.tar.gz $ cd pcre-8.36 $ ./configure $ make $ make install
./エラー報告を設定します(推奨学習: nginx チュートリアル )
configure: error: You need a C++ compile r for C++ support.
解決策: yum install -y gccgcc-c
1.2. zlib ライブラリをインストールします
$ cd /usr/local/ $ wget http://zlib.net/zlib-1.2.8.tar.gz $ tar -zxvf zlib-1.2.8.tar.gz $ cd zlib-1.2.8 $ ./configure $ make $ make install
1.3. ssl
$ cd /usr/local/ $ wget http://www.openssl.org/source/openssl-1.0.1j.tar.gz $ tar -zxvf openssl-1.0.1j.tar.gz $ ./config $ make $ make install
1.3. NGINX のインストール
$ cd /usr/local/ $ wget http://nginx.org/download/nginx-1.8.0.tar.gz $ tar -zxvf nginx-1.8.0.tar.gz $ cd nginx-1.8.0 $ ./configure --prefix=/usr/local/nginx $ make $ make install
一般的なインストール エラー:
Nginx 起動プロンプトで libpcre.so.1 ソリューションが見つかりません
32 ビット システムの場合
[root@lee ~]# ln -s /usr/local/lib/libpcre.so.1 /lib
64 ビット システムの場合
[root@lee ~]# ln -s /usr/local/lib/libpcre.so.1 /lib64
次に、nginx を起動します。 OK
[root@lee ~]# /usr/local/webserver/nginx/sbin/nginx
1.4. NGINX を起動します
$ /usr/local/nginx/sbin/nginx
ブラウザを開いて、このマシンの IP にアクセスします。ブラウザに「Welcome to nginx!」と表示されれば、は、Nginx がインストールされ、正常に実行されたことを意味します。
2. 一般的な NGINX コマンド
重启: $ /usr/local/nginx/sbin/nginx 启动命令 重启: $ /usr/local/nginx/sbin/nginx –s reload 停止: $ /usr/local/nginx/sbin/nginx –s stop 测试配置文件是否正常: $ /usr/local/nginx/sbin/nginx –t 强制关闭: $ pkillnginx
3. Nginx Keepalived の開始
3.1. Keepalived とは
Keepalived は、レイヤー 3、レイヤー 4、および 7 スイッチング メカニズムと同様の C で書かれた無料のオープンソース ソフトウェアで、通常話題になるレイヤー 3、レイヤー 4、レイヤー 7 スイッチの機能を備えています。主に loadbalancing (負荷分散) 機能と high-availability (高可用性) 機能を提供します。負荷分散の実装には Linux の仮想サービス カーネル モジュール (ipvs) に依存する必要がありますが、高可用性は実現できません。 VRRP 経由 このプロトコルは、複数のマシン間のフェイルオーバー サービスを実装します。
上の図はKeepalivedの機能アーキテクチャで、大きくユーザー空間とカーネル空間の2層に分かれています。
カーネル空間: 主に、IPVS (ネットワーク サービスの負荷分散を実現するために使用される IP 仮想サーバー) と NETLINK (高度なルーティングおよびその他の関連ネットワーク機能を提供する) の 2 つの部分が含まれます。
ユーザースペース:
Keepalived のすべての機能は、keepalived.conf ファイルを構成することによって実装されます。
3.2. Keepalived のインストール
keepalived アドレスをダウンロードします: http://www.keepalived.org/download.html
解凍してインストールします:
tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/ yum install -yopensslopenssl-devel(需要安装一个软件包) cd keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived make&& make install
3.3. Linux システム サービスとして Keepalived をインストールします
将keepalived安装成Linux系统服务,因为没有使用keepalived的默认安装路径(默认路径:/usr/local),安装完成之后,需要做一些修改工作: 首先创建文件夹,将keepalived配置文件进行复制: mkdir /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ 然后复制keepalived脚本文件: cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ ln -s /usr/local/sbin/keepalived /usr/sbin/ ln -s /usr/local/keepalived/sbin/keepalived /sbin/ 可以设置开机启动:chkconfigkeepalived on,到此我们安装完毕!
3.4. 一般的な Keepalived コマンド
servicekeepalived start servicekeepalived stop
4 . Keepalived 設定
4.1. NGINX のアクティブおよびバックアップの自動再起動を設定します
1. 設定ファイルを変更します:vim /etc / keepalived/keepalived.conf
1) マスター NGINX 構成の変更
<span style="color: #000000;">! Configuration File for keepalived global_defs { router_id bhz005 ##标识节点的字符串,通常为hostname } ## keepalived会定时执行脚本并且对脚本的执行结果进行分析,动态调整vrrp_instance的优先级。这里的权重weight 是与下面的优先级priority有关,如果执行了一次检查脚本成功,则权重会-20,也就是由100 - 20 <br>变成了80,Master 的优先级为80 就低于了Backup的优先级90,那么会进行自动的主备切换。 如果脚本执行结果为0并且weight配置的值大于0,则优先级会相应增加。 如果脚本执行结果不为0 并且weight配置的值小于0,则优先级会相应减少。 vrrp_scriptchk_nginx { script "/etc/keepalived/nginx_check.sh" ##执行脚本位置 interval 2 ##检测时间间隔 weight -20 ## 如果条件成立则权重减20(-20) } ## 定义虚拟路由 VI_1为自定义标识。 vrrp_instance VI_1 { state MASTER ## 主节点为MASTER,备份节点为BACKUP ## 绑定虚拟IP的网络接口(网卡),与本机IP地址所在的网络接口相同(我这里是eth6) interface eth6 virtual_router_id 172 ## 虚拟路由ID号 mcast_src_ip 192.168.1.172 ## 本机ip地址 priority 100 ##优先级配置(0-254的值) Nopreempt ## advert_int 1 ## 组播信息发送间隔,俩个节点必须配置一致,默认1s authentication { auth_type PASS auth_passbhz ## 真实生产环境下对密码进行匹配 } track_script { chk_nginx } virtual_ipaddress { 192.168.1.170 ## 虚拟ip(vip),可以指定多个 } }</span>
2) バックアップ NGINX 構成の変更
! Configuration File for keepalived global_defs { router_id bhz006 } vrrp_scriptchk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 weight -20 } vrrp_instance VI_1 { state BACKUP interface eth7 virtual_router_id 173 mcast_src_ip 192.168.1.173 priority 90 ##优先级配置 advert_int 1 authentication { auth_type PASS auth_passbhz } track_script { chk_nginx } virtual_ipaddress { 192.168.1.170 } }
3) nginx_check.sh スクリプト
#!/bin/bash A=`ps -C nginx–no-header |wc -l` if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx sleep 2 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killallkeepalived fi fi
4) 次に、マスターの keepalived 構成ファイルをマスター マシンの /etc/keepalived/ フォルダーにコピーし (172)、次にバックアップの keepalived 構成ファイルをバックアップ マシンの /etc/keepalived/ にコピーします (173) . フォルダーに移動し、最後に nginx_check.sh スクリプトを 2 つのマシンの /etc/keepalived/ フォルダーにコピーします。
5) nginx_check.sh スクリプトの承認。実行可能権限を付与します: chmod x /etc/keepalived/nginx_check.sh
6) 2 台のマシンで nginx を起動した後。両方のマシンで keepalived
/usr/local/nginx/sbin/nginx servicekeepalived start ps -ef | grepnginx ps -ef | grepkeepalived
7 を開始しましょう。2 台のマシンの IP アドレスを見てください。コマンドの下に仮想 IP が表示されます。 Keepalived を閉じずにテストし、NGINX を強制終了して、再起動するかどうかを観察します。 Keepalived をオフにして NGINX を終了し、再起動するかどうかを確認します。
#5. クラスター状況におけるセッション共有ソリューション
5.1. クラスター状況におけるセッションの原因は何ですか?セッション ストレージが原因です。サーバー側では、クラスター内のユーザーが異なるサーバーにアクセスする可能性があるため、セッションが共有されない可能性があります。 5.2、セッション共有ソリューション1)NGINX做的负载均衡可以绑定ip_hash,从而使同一个IP访问同一个服务器 ------------------该方案使得集群失去意义。
2)利用数据库同步session----------------------太过复杂
3)利用cookie同步session(保存一个session到本地,再次访问将其带到服务器端)----------------------安全性差、http请求都需要带参数增加了带宽消耗
4)使用session集群,存放到redis中(spring-session)
5.3、spring-session项目,解决session共享问题
949a265f4ecf2de05455fc66d0b4c6e4 b4b38e33757a6497aa8690936b905cc1 05a8acc5c31084a4f61ade01873802caorg.springframework.boot192ca2f7b8c770b01c8f81e6bdd5b947 9bc4cbb67f66e148869423c0d27e5f90spring-boot-starter-redisb68fb17cb904a46b73e6272850323873 09a0e22e5aaafd848ae04665be625b91 706be6ab47249fb2329193d8a72593e2 b4b38e33757a6497aa8690936b905cc1 05a8acc5c31084a4f61ade01873802caorg.springframework.session192ca2f7b8c770b01c8f81e6bdd5b947 9bc4cbb67f66e148869423c0d27e5f90spring-session-data-redisb68fb17cb904a46b73e6272850323873 09a0e22e5aaafd848ae04665be625b91
创建SessionConfig
import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; //这个类用配置redis服务器的连接 //maxInactiveIntervalInSeconds为SpringSession的过期时间(单位:秒) @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800) Public class SessionConfig { // 冒号后的值为没有配置文件时,制动装载的默认值 @Value("${redis.hostname:localhost}") String HostName; @Value("${redis.port:6379}") int Port; @Bean Public JedisConnectionFactory connectionFactory() { JedisConnectionFactory connection = new JedisConnectionFactory(); connection.setPort(Port); connection.setHostName(HostName); return connection; } }
初始化Session
//初始化Session配置Public class SessionInitializer extends AbstractHttpSessionApplicationInitializer{ Public SessionInitializer() { super(SessionConfig.class); } }
控制层代码
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestControllerpublic class SessionController { @Value("${server.port}") private String PORT; @RequestMapping("/index") public String index() { return "index:" + PORT; } /** * @methodDesc: 功能描述:(往session存放值) */ @RequestMapping("/setSession") public String setSession(HttpServletRequest request, String sessionKey, String sessionValue) { HttpSession session = request.getSession(true); session.setAttribute(sessionKey, sessionValue); return "success,port:" + PORT; } /** * @methodDesc: 功能描述:(从Session获取值) */ @RequestMapping("/getSession") public String getSession(HttpServletRequest request, String sessionKey) { HttpSession session =null; try { session = request.getSession(false); } catch (Exception e) { e.printStackTrace(); } String value=null; if(session!=null){ value = (String) session.getAttribute(sessionKey); } return "sessionValue:" + value + ",port:" + PORT; } }
六、高并发解决方案
业务数据库 -》 数据水平分割(分区分表分库)、读写分离
业务应用 -》 逻辑代码优化(算法优化)、公共数据缓存
应用服务器 -》 反向静态代理、配置优化、负载均衡(apache分发,多tomcat实例)
系统环境 -》 JVM调优
页面优化 -》 减少页面连接数、页面尺寸瘦身
动态资源和静态资源分离
CDN加速
服务分布式部署
以上がNGINX は Linux で高可用性を実現しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。