#php #mysql #amazon-web-services #apache #amazon-ec2
#php #mysql #amazon-web-сервисы #apache #amazon-ec2
Вопрос:
Я развернул экземпляр AWS EC2 с развернутым Apache, в котором размещена простая форма регистрации / входа. Когда пользователь регистрируется, его учетные данные сохраняются в базе данных MySQL, которая развертывается на вторичном экземпляре AWS EC2. Поэтому, когда пользователь попадает на страницу входа, он вводит свои учетные данные, а PHP-код проверяет подлинность данных в базе данных MySQL и впоследствии разрешает пользователю войти.
Эта настройка развернута в двух AZ, а базы данных MySQL реплицируются Master-Master.
Я хотел бы разместить балансировщик нагрузки приложений перед двумя веб-серверами AWS EC2 (Apache) для учета сбоев в одном из AZS. Однако, когда я развертываю балансировщик нагрузки приложений AWS и использую DNS-имя для входа в систему, приложение, похоже, не проверяет подлинность учетных данных пользователей и удаляет имя пользователя / пароль из формы (почти как при обновлении страницы).).
Приложение было построено на PHP и действительно простое, но я не могу понять, почему при использовании балансировщика нагрузки мое приложение не работает?
Есть предложения??
Мой метод аутентификации:
<?php
session_start();
// Change this to your connection info.
$DATABASE_HOST = 'XXX.XX.XX.XX';
$DATABASE_USER = 'XXX';
$DATABASE_PASS = 'XXX';
$DATABASE_NAME = 'XXX';
// Try and connect using the info above.
$con = mysqli_connect($DATABASE_HOST, $DATABASE_USER, $DATABASE_PASS, $DATABASE_NAME);
if ( mysqli_connect_errno() ) {
// If there is an error with the connection, stop the script and display the error.
exit('Failed to connect to MySQL: ' . mysqli_connect_error());
}
// Now we check if the data from the login form was submitted, isset() will check if the data exists.
if ( !isset($_POST['username'], $_POST['password']) ) {
// Could not get the data that should have been sent.
exit('Please fill both the username and password fields!');
}
// Prepare our SQL
if ($stmt = $con->prepare('SELECT id, password FROM accounts WHERE username = ?')) {
// Bind parameters (s = string, i = int, b = blob, etc), in our case the username is a string so we use "s"
$stmt->bind_param('s', $_POST['username']);
$stmt->execute();
// Store the result so we can check if the account exists in the database.
$stmt->store_result();
if ($stmt->num_rows > 0) {
$stmt->bind_result($id, $password);
$stmt->fetch();
// Account exists, now we verify the password.
if ($_POST['password'] === $password) {
// Verification success! User has logged-in!
// Create sessions, so we know the user is logged in, they basically act like cookies but remember the data on the server.
session_regenerate_id();
$_SESSION['loggedin'] = TRUE;
$_SESSION['name'] = $_POST['username'];
$_SESSION['id'] = $id;
// echo 'Welcome ' . $_SESSION['name'] . '!';
header('Location: home.php');
} else {
// Incorrect password
echo 'Incorrect username and/or password!';
}
} else {
// Incorrect username
echo 'Incorrect username and/or password!';
}
$stmt->close();
}
?>
Комментарии:
1. Настроено ли у вас распределенное хранилище сеансов? Если нет, включены ли в балансировщике нагрузки зацикленные сеансы?
2. Нет @MarkB, насколько мне известно, у меня нет хранилища сеансов распространения, и у меня не включены сеансы привязки. Конфигурация, используемая в Apache, используется по умолчанию (т. Е. Я ничего не менял).
Ответ №1:
У вас не может быть нескольких веб-серверов, требующих входа пользователя в систему, без включенного хранилища распределенных сеансов или фиксированных сеансов. Прямо сейчас ваш пользовательский сеанс перемещается между несколькими серверами, но вы вошли только на один из этих серверов.
Самый простой способ исправить это — просто зайти в настройки балансировщика нагрузки и включить пока «липкие сеансы», чтобы все запросы пользователя «прилипали» к одному серверу.