[LINUX] Die Geschichte des erneuten Bereitstellens des Anwendungsservers

Wir haben vor etwa 10 Jahren auf die Anfrage geantwortet, den Anwendungsserver durch einen neuen Server zu ersetzen, ohne den Dienst zu beenden. Daher werden wir das Migrationsverfahren kurz vorstellen. image.png

Spezifikationen / Anforderungen

Verschieben Sie die auf dem alten Server ausgeführte Webanwendung auf den neuen Server. Die Spezifikationen von alten und neuen Servern lauten wie folgt.

Art Alter Server Neuer Server
Wolke Sakuras VPS Azure VM
OS CentOS 5.11 CentOS 7.4
WWW-Server httpd 2.2.3 httpd 2.4.6
AP-Server Tomcat 5.5.26 Tomcat 5.5.26
Verbinder mod_jk mod_proxy_ajp
Laufzeit jdk 1.5.0_22 jdk 1.8.0_162
DBMS PostgreSQL 8.1.23 PostgreSQL 9.2.23

――Es handelt sich um einen BtoB-Webdienst, der von Dutzenden von Unternehmen verwendet wird, wenn auch in geringem Umfang, 24 Stunden am Tag, 365 Tage im Jahr.

Erstellen Sie einen neuen Server

Stellen Sie ** CentOS-basiertes 7.4 ** über "Ressource erstellen" im Azure-Portal bereit. image.png Melden Sie sich bei der VM an und fügen Sie die erforderlichen Module hinzu.

Installieren von Oracle Java 8 (JDK 1.8)

Ich habe OpenJDK nicht verwendet, da es von Tomcat nicht offiziell unterstützt wird.

# rpm -ivh jdk-8u162-linux-x64.rpm

# java -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)

Installation des WWW-Servers (Apache)

yum -y install httpd
yum -y install mod_ssl

httpd -v
Server version: Apache/2.4.6 (CentOS)

Funktioniert mit Tomcat.

apache:/etc/httpd/conf.d/foo.conf


<Location /foo/>
    ProxyPass ajp://127.0.0.1:8009/foo/
</Location>

Machen Sie ein Loch in den Hafen, den Sie für das Geschäft benötigen.

firewall-cmd --list-all
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Nach Eingabe des Serverzertifikats empfiehlt es sich, unter https://www.ssllabs.com/ssltest/ eine SSL-Schwachstellendiagnose zu erhalten und die Anzeige zu korrigieren.

Tomcat installieren

Als 5.5.36, die neueste 5.5-Serie, übernommen wurde, warf die Methode "HttpServletRequest # getAttribute" auf einigen Bildschirmen "NullPointerException" aus, sodass die herkömmliche 5.5.26 beibehalten wurde. Der Quellcode wird nicht bekannt gegeben oder der Entwickler hat kein Geschäft. Dekompilieren Sie ihn und beheben Sie ihn mit dem Plug-In IntelliJ IDEA. Ich mache das nicht, weil das Risiko hoch ist.

cd /usr/local
wget https://archive.apache.org/dist/tomcat/tomcat-5/v5.5.26/bin/apache-tomcat-5.5.26.tar.gz
tar zxvf apache-tomcat-5.5.26.tar.gz

ln -s apache-tomcat-5.5.26 tomcat5

Erstellen Sie einen Kontextdeskriptor.

/usr/local/tomcat5/conf/Catalina/localhost/foo.xml


<?xml version="1.0" encoding="utf-8"?>
<Context path="/foo" reloadable="true" docBase="/var/app/webapps/foo"></Context>

Legen Sie den 8009-Port fest, an dem Tomcat mit mod_proxy_ajp kommuniziert.

/usr/local/tomcat5/conf/server.xml


<Connector port="8009"
    maxThreads="150" minSpareThreads="25" maxSpareThreads="100"
    acceptCount="100" connectionTimeout="0"
/>

Kommentieren Sie <Connector port =" 8080 "... /> aus, um es zu deaktivieren. Da das Servlet vom alten Server nach / var / app / webapps kopiert wurde, ändern Sie die appBase von "<Host name =" localhost "... />" in "/ var / app / webapps".

Registrieren Sie Tomcat als Service

/etc/systemd/system/tomcat.service


[Unit]
Description=Apache Tomcat 5 Servlet Container
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/usr/local/tomcat5/bin/startup.sh
ExecStop=/usr/local/tomcat5/bin/shutdown.sh
KillMode=none

[Install]
WantedBy=multi-user.target

JDBC-Treiber-Update

Der JDBC unter Webanwendungen ist noch alt. Ersetzen Sie ihn daher durch einen JDBC, der PostgreSQL 9.2 unterstützt.

cd /var/app/webapps/foo/WEB-INF/lib
wget https://jdbc.postgresql.org/download/postgresql-42.2.2.jar

PHP7 Installation

Für den neuen Server muss PHP neben JavaServlet / JSP auch Dienste in PHP / Laravel bereitstellen.

rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum -y install --enablerepo=remi-php72 php php-mbstring php-pear php-fpm php-pecl-mcrypt php-pecl-zip php-xml php-gd php-pdo php-mysqlnd php-pgsql

Fügen wir auch Composer hinzu. (Wird nicht auf dem Produktionsserver verwendet, aber nur für den Fall)

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

Installation des DB-Servers

# yum -y install postgresql-server
# postgresql-setup initdb

# psql --version
psql (PostgreSQL) 9.2.23

Datenbankmigration

Holen Sie sich einen Speicherauszug auf dem alten Server und kopieren Sie ihn auf den neuen Server.

Alter Server


su - postgres
pg_dump foo > /tmp/foo.txt

scp /tmp/foo.txt [email protected]:/tmp

Auf dem neuen Server wiederherstellen.

su - postgres
createdb foo
psql foo < /tmp/foo.txt

Implizite Besetzung hinzufügen

Seit Version 8.3 verfügt PostgreSQL über strengere Überprüfungen der Typkonvertierung und keine implizite Typkonvertierung. https://qiita.com/seiketkm/items/9d069348c2906a6ae011 https://qiita.com/6in/items/f23ead1314b9e6d2f2b7 Fügen Sie eine implizite Besetzung hinzu, indem Sie auf Artikel wie.

cat << 'EOF' > /tmp/cast.sql
CREATE CAST (int2 AS text) WITH INOUT AS IMPLICIT;
CREATE CAST (int4 AS text) WITH INOUT AS IMPLICIT;
CREATE CAST (int8 AS text) WITH INOUT AS IMPLICIT;
CREATE CAST (text AS numeric) WITH INOUT AS IMPLICIT;
CREATE CAST (numeric AS character) WITH INOUT AS IMPLICIT;
CREATE CAST (character varying AS numeric) WITH INOUT AS IMPLICIT;
CREATE CAST (timestamp without time zone AS text) WITH INOUT AS IMPLICIT;
CREATE CAST (timestamp without time zone AS character varying) WITH INOUT AS IMPLICIT;
CREATE CAST (character varying AS timestamp without time zone) WITH INOUT AS IMPLICIT;
CREATE CAST (timestamp with time zone AS text) WITH INOUT AS IMPLICIT;
CREATE FUNCTION textint4cat(text, int4) RETURNS text AS 'SELECT $1 || $2::pg_catalog.text' LANGUAGE sql IMMUTABLE STRICT;
CREATE OPERATOR || (PROCEDURE = textint4cat,LEFTARG = text, RIGHTARG = int4);
EOF

psql foo < /tmp/cast.sql

Überprüfen Sie die Liste der Abgüsse.

psql foo
\dC

Funktionsprüfung

Überprüfen Sie zu diesem Zeitpunkt einmal den Betrieb der Webanwendung.

Migration

Es wird mitten in der Nacht durchgeführt, wenn die Anzahl der Dienstnutzer überwiegend gering ist. Im Folgenden sind alle Vorgänge des alten Servers aufgeführt.

Zugriffsprotokollüberwachung

Starten Sie ein anderes Terminal und überwachen Sie das Zugriffsprotokoll.

tail -f /var/log/httpd/old.example.com.access.log

Kopie der Datenbank

Wenn kein Zugriff besteht, stellen Sie den Speicherauszug des alten Servers auf dem neuen Server wieder her. Wenn in der Zwischenzeit Zugriff besteht, versuchen Sie es erneut!

Einstellungen umleiten

301-Umleitung (permanente Übertragung) verlässt den Umleitungscache im Browser und kann nicht zurückgegeben werden. Verwenden Sie daher 302-Umleitung (temporäre Übertragung).

httpd.conf


Redirect temp /foo/ https://new.example.com/foo/

Starten Sie httpd neu, nachdem Sie bestätigt haben, dass kein Zugriff mehr besteht. Überprüfen Sie, ob die Anforderung an den neuen Server weitergeleitet wurde.

Ändern Sie den Datenbanknamen des alten Servers

Stellen Sie sicher, dass selbst wenn Sie versehentlich auf den alten Server zugreifen können, dieser als Fehler gemeldet wird.

su - postgres
psql
alter database "foo" rename to "foo_BK";

DNS-Umschaltung

Wenn Sie auf einem virtuellen Host arbeiten, wird dieser nur dann korrekt angezeigt, wenn zum Zeitpunkt der Veröffentlichung in der Domäne darauf zugegriffen wird. Bearbeiten Sie die Hosts-Datei des Clients, um mit der neuen Domain zu testen, bevor Sie das DNS neu schreiben. Unter Windows befindet sich der Speicherort der Hosts-Datei unten.

C:\Windows\System32\drivers\etc\hosts

Starten Sie einen Texteditor wie Notepad mit Administratorrechten und fügen Sie ihn mit "Neue IP-Adresse (Speicherplatz) alte Domäne" hinzu.

Wenn der Test erfolgreich ist, bearbeiten Sie die Zonendatei auf dem DNS-Server. Ändern Sie die in der Domäne des alten Servers definierte globale IP-Adresse in die globale IP-Adresse des neuen Servers und schließen Sie den alten Server, wenn die DNS-Weitergabe durchgeführt wird.

config:/usr/local/etc/namedb/master/example.com.zone


$TTL 3600
$ORIGIN example.com.
@       IN      SOA     xxx.example.com. (
        2019070101      ; Serial
        43200           ; Refresh after 12 hours
        3600            ; Retry after one hour
        2419200         ; Expire after 4 weeks
        1200    )       ; Negative cache TTL of 20 minutes
;
; Authoritative name servers
;
        IN      NS      ns01.example.com.
;
; Host
;
old     3600     IN      A       nnn.nnn.nnn.nnn  ;Ändern Sie die IP-Adresse des neuen Servers

Recommended Posts

Die Geschichte des erneuten Bereitstellens des Anwendungsservers
Die Geschichte von sys.path.append ()
Die Geschichte des Baus von Zabbix 4.4
Die Geschichte des Starts eines Minecraft-Servers von Discord
Die Geschichte von Python und die Geschichte von NaN
Die Geschichte der Teilnahme an AtCoder
Die Geschichte des Exportierens eines Programms
Die Geschichte der Release-Arbeit der Anwendung, die Google nicht erzählt
Die Geschichte des Versuchs, den Client wieder zu verbinden
Ich habe den asynchronen Server von Django 3.0 ausprobiert
Die Geschichte eines Fehlers in PyOCR
Die Geschichte, MeCab in Ubuntu 16.04 zu setzen
Die Geschichte einer unveränderlichen Form
Die Geschichte der Manipulation globaler Python-Variablen
Die Geschichte, deep3d auszuprobieren und zu verlieren
Dekodierung von Keras 'LSTM model.predict
Die Geschichte der Verarbeitung A von Blackjack (Python)
Die Geschichte von pep8 wechselt zu pycodestyle
Ändern Sie den Ziel-Batfish-Server von Pybatfish
Die Geschichte der Entwicklung einer WEB-Anwendung, die automatisch Fangkopien generiert [MeCab]
Die Geschichte des tiefen Lernens mit TPU
Beenden Sie den eingefrorenen lokalen Anwendungsserver von Rails (Puma).
Die Geschichte, dass die Lernkosten von Python niedrig sind
Die Geschichte der Herstellung des Mel Icon Generator Version 2
Überwachen Sie regelmäßig die HTTP-Antwort des Webservers
Bildverarbeitung? Die Geschichte, Python für zu starten
Die Geschichte des Fehlinterpretierens der Swap-Zeile des obersten Befehls
Die Geschichte des Lesens von HSPICE-Daten in Python
Die Geschichte, Sourcetrail × macOS × VS Code auszuprobieren
Die Geschichte der Anzeige von Mediendateien in Django
Die Geschichte eines Mel-Icon-Generators
[Kleine Geschichte] Laden Sie das Bild von Ghibli sofort herunter
Die Geschichte vom Umzug von Pipenv zur Poesie
Die Geschichte der Erstellung einer Webanwendung, die umfangreiche Lesungen mit Django aufzeichnet
Der Beginn von cif2cell
Die Geschichte von Python ohne Inkrement- und Dekrementoperatoren.
Die Geschichte des Stoppens des Produktionsdienstes mit dem Befehl hostname
Die Geschichte der durch gcrypto20 verursachten Nichtübereinstimmung von Hash Sum
Die Bedeutung des Selbst
Die Geschichte des Teilens der Pyenv-Umgebung mit mehreren Benutzern
der Zen von Python
Die Geschichte eines neuronalen Netzwerks der Musikgeneration
Die Geschichte von FileNotFound im Python open () -Modus = 'w'
Visualisierung der Verbindung zwischen Malware und dem Callback-Server
Eine Geschichte über die Änderung des Master-Namens von BlueZ
Suchen Sie eine Richtlinie für die Anzahl der Prozesse / Threads, die auf dem Anwendungsserver festgelegt werden sollen
Die Geschichte, dass der Rückgabewert von tape.gradient () None war
Eine Geschichte, die die Lieferung von Nico Nama analysierte.
AttributeError: Die Geschichte des Lösens des Moduls'tensorflow 'hat kein Attribut' log '.
Die Geschichte der automatischen Sprachkonvertierung von TypeScript / JavaScript / Python
Anwendung von Python 3 vars
Die Geschichte, ein Ring-Fit-Abenteuer kaufen zu wollen
Die Geschichte der Verwendung von Circleci zum Bau vieler Linux-Räder
Rache der Typen: Rache der Typen
Die Geschichte der Einrichtung eines VIP-Kanals im internen Chatwork