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.
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.
Stellen Sie ** CentOS-basiertes 7.4 ** über "Ressource erstellen" im Azure-Portal bereit. Melden Sie sich bei der VM an und fügen Sie die erforderlichen Module hinzu.
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)
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.
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".
/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
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
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
# yum -y install postgresql-server
# postgresql-setup initdb
# psql --version
psql (PostgreSQL) 9.2.23
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
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
Überprüfen Sie zu diesem Zeitpunkt einmal den Betrieb der Webanwendung.
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.
Starten Sie ein anderes Terminal und überwachen Sie das Zugriffsprotokoll.
tail -f /var/log/httpd/old.example.com.access.log
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!
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.
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";
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